web-dev-qa-db-fra.com

update_post_meta () ne fonctionne pas dans save_post

J'ai ajouté des champs de saisie de texte à metabox dans mon message personnalisé. Maintenant, chaque fois que je mets des données dans ces champs de texte dans le panneau d'administration et que je clique sur "Enregistrer", toutes les données disparaissent. Voici le code:

<?php
function swpd_render_info_fields()
{
    ?>
    <label for="swpd_comany_addr">Company Address</label>
    <input type="text" name="swpd_company_addr" id="swpd_company_addr" />
    <?php
}
/* * Process the custom metabox fields */
add_action( 'save_post', 'swpd_save_info_fields',99 );
function swpd_save_info_fields($post_id) {
    global $post;
    if(isset($_POST['post_type']) && ($_POST['post_type'] == "swpd_directory")){
        update_post_meta( $post->ID, 'swpd_company_addr', $_POST['swpd_company_addr'] );
    }
}
?>

J'ai vérifié les données transmises à update_post_meta () et il semble que tout se passe bien, $ post-> ID contient l'identifiant du post et $ _POST ['swpd_company_addr'] contient la chaîne que je souhaite enregistrer en méta. J'ai vraiment fait une recherche approfondie et aucune des solutions ne résout mon problème. Qu'est-ce qui ne va pas?

1
HoGo

Vous ne récupérez pas les données enregistrées et ne remplissez pas le formulaire.

function swpd_render_info_fields()
{
    ?>
    <label for="swpd_comany_addr">Company Address</label>
    <input type="text" name="swpd_company_addr" id="swpd_company_addr" />
    <?php
}

Il n'y a rien dans cette fonction qui pourrait insérer vos données sauvegardées. Vous écrivez juste un formulaire vierge à chaque fois. Vous devez renseigner de manière conditionnelle la valeur input.

function swpd_render_info_fields($post)
{
    $meta = get_post_meta($post->ID);
    $value = (!empty($meta['swpd_company_addr'])) 
        ? $meta['swpd_company_addr']
        : '';
    ?>
    <label for="swpd_comany_addr">Company Address</label>
    <input type="text" name="swpd_company_addr" id="swpd_company_addr" value="<?php echo $value ?>" />
    <?php
}

Je devine beaucoup à la façon dont votre code fonctionne mais c'est l'idée. Vous devez remplir le formulaire avec les valeurs existantes de la base de données ou vous recommencez chaque fois.

0
s_ha_dum

Vos données personnalisées sont supprimées lors de la sauvegarde automatique, car vous avez oublié de vérifier cela. Étendez votre gestionnaire de sauvegarde:

if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
    return;

L'enregistrement automatique déclenchera save_post, mais les champs personnalisés ne sont pas envoyés.

0
fuxia