J’ai des méta-valeurs personnalisées pour un type de publication personnalisé (“événement”). Le type de publication personnalisé est affiché dans l’administrateur et les champs méta personnalisés s’affichent correctement. j’utilise save_post_{$post->post_type}
crochet pour valider les champs méta et modifier le post_status
pour draft
(en utilisant wp_update_post
) en fonction de la validation des champs méta et du nouveau jeu post_status
.
Problème:
Tout fonctionne sauf que la section en haut à droite (dans la page d’édition des messages d’administration) ne reflète pas le changement de statut. Si je publie un article, la validation fonctionne bien avec le post_status
mis à draft
en fonction de la condition réglée à l’intérieur save_post_{$post->post_type}
. Mais le coin supérieur droit de l’interface utilisateur indique “le message est maintenant en ligne”, “liens de visite”, etc. (écrans n ° 1). Lors de l’actualisation de la page, le bon draft
la vue d’état est reflétée (Écrans #2).
Écrans #1 :
Bien que le post_status
est configuré avec succès pour brouillon à partir de save_post_{$post->post_type}
la vue de l’interface utilisateur reflète le statut “publié”.
Écrans #2 :
Lors de l’actualisation, l’état actuel du brouillon est restauré :
public function __construct()
{
$this->sconfig= ['post_type'=> 'event', 'slug'=>'events'];
/*
...
post type and meta declarations
...
*/
add_action('save_post_'.$this->sconfig['post_type'], array($this, 'event_mbox_save'), 10, 2);
}
function event_mbox_save($post_id, $post=false)
{
if (!isset($_POST['event_mbox_nonce']) || !wp_verify_nonce($_POST['event_mbox_nonce'], basename(__FILE__)))
return $post_id;
$valstat= $this->get_meta_posted_vals($_POST); // Validates the custom meta values. Returns $valstat['stat']= 0 if invalid and $valstat['log']= 'error message'.
$original_pstat= $_POST['original_post_status'];
$new_pstat= $_POST['post_status'];
$insmeta= true;
$errmsg= '';
if(($valstat['stat'] == 0) && (!empty($original_pstat)))
{
if(($new_pstat == 'publish') || ($new_pstat == 'future'))
{
remove_action('save_post_'.$this->sconfig['post_type'], array($this, 'event_mbox_save'), 10, 3);
wp_update_post(array( 'ID' => $post_id, 'post_status' => 'draft') ); // Setting the post to draft
add_action('save_post_'.$this->sconfig['post_type'], array($this, 'event_mbox_save'), 10, 3);
$errmsg= 'ERROR: '.$valstat['log'].' ('.$this->sconfig['post_type'].' reverted to '.$original_pstat.' status.)';
$insmeta= false; // setting meta insertion false
}
}
if(!empty($errmsg))
setcookie('event8273_add_notice', $errmsg, 0, "https://wordpress.stackexchange.com/" );
if($insmeta)
{
$evabstract = isset($postVal['evabstract']) ? $postVal['evabstract'] : '';
if (empty($evabstract))
add_post_meta($post_id, 'evabstract', $_POST['evabstract'], true);
else
update_post_meta($post_id, 'evabstract', $_POST['evabstract']);
}
}
Note:
j’ai essayé d’utiliser wp_insert_post_data
avec redirect_post_location
qui n’a pas fonctionné non plus.