X

champ personnalisé – Définissez le statut de la publication sur brouillon après avoir validé les méta-valeurs de la publication dans le crochet save_post


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é”.

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.