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?
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.