web-dev-qa-db-fra.com

RW Meta Box, titre de post-établissement

J'utilise RW_Meta_Box plugin par Rilwis .

J'utilise un CPT et ai ajouté une méta-boîte personnalisée et supprimé les title et editor.

Mais je veux toujours définir le titre pour des raisons évidentes.

J'ai créé le CPT et la méta-boîte et tout fonctionnait parfaitement, y compris la page all posts à l'aide de hooks custom column.

Dès que je me suis assis pour définir le titre du message sur l'un des champs de la méta-boîte, je n'ai pas réussi à obtenir les résultats souhaités. J'ai essayé les solutions que j'ai choisies en cherchant dans ce site de questions-réponses.

Au départ j'ai essayé:

SOLUTION1:

add_action('submitpost_box', 'hidden_type_title');

function hidden_type_title() {
    global $current_user, $post, $post_type;
    global $prefix;
    $md = rwmb_meta($prefix . 'name', array('type' => 'text'), $post->ID);
    if ($post->post_type == 'MY_CPT_NAME') {
    ?>
    <input type="hidden" name="post_title" value="<?php echo esc_attr(htmlspecialchars($md)); ?>" id="title" />
    <?php
    } else {
    return;
    }
}

Le code ci-dessus fonctionne bien mais il y a un problème que je ne parviens pas à détecter. c'est-à-dire que je dois mettre à jour le message deux fois pour définir le titre du message.

J'ai donc essayé le hook save_post comme ceci:

SOLUTION2:

add_action('save_post', 'post_updated');

function post_updated($post_id) {
    global $current_user, $post;
    if ($post->post_type != 'MY_CPT_NAME') {
    return;
    }

    global $prefix;
    $md = rwmb_meta($prefix . 'name', array('type' => 'text'), $post_id);
    // verify post is not a revision & not an autosave
    if (!wp_is_post_revision($post_id) && !(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)) {
    // set the new post title
    $post->ID = $post_id;
    $post->post_title = $md;

    // update the post, removing the action to prevent an infinite loop
    remove_action('save_post', 'post_updated');
    wp_update_post($post);
    add_action('save_post', 'post_updated');
    return;
    }
}

Maintenant, je suis dans une situation pire, le titre de l'article est défini instantanément, mais mes données de méta-boîte ne sont pas enregistrées.

Quel est le problème avec la première solution?

1
Junaid Qadir

Voici une solution qui tire parti du crochet d'action de Rilwis ... pour que vous puissiez profiter de sa vérification de la non-divulgation sans avoir à ajouter la vôtre.

add_action('rwmb_after_save_post', 'post_updated');

function post_updated($post_id) {

    // verify post is not a revision & not an autosave
    if (!wp_is_post_revision($post_id) && !(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)) {

    global $prefix;
    $prefix . 'name';

    // check that the custom field is being POSTED 

    if( isset( $_POST[$prefix . 'name'] ) ){    
        $my_post = array();
        $my_post['ID'] = $post_id;
        $my_post['post_title'] = sanitize_title( $_POST[$prefix . 'name'] );

        // Update the post into the database
        wp_update_post( $my_post );   

        }

    }
}

Pour limiter cette fonction à uniquement pour un métabox spécifique, vous pouvez utiliser ce add_action à la place:

add_action("rwmb_{$meta_box['id']}_after_save_post", 'post_updated');

Sans voir vos définitions de metabox, je ne sais pas en quoi changer l'ID, vous devrez donc le faire.

NB: Non testé, mais je pense que c'est proche. Veuillez consulter wp_update_post() dans le codex pour connaître le fonctionnement de cette fonction.

2
helgatheviking