WordPress

pole niestandardowe — Ustaw status postu na wersję roboczą po sprawdzeniu poprawności wartości meta postu w haku save_post

  • 20 lutego, 2023
  • 3 min read
pole niestandardowe — Ustaw status postu na wersję roboczą po sprawdzeniu poprawności wartości meta postu w haku save_post


Mam kilka niestandardowych wartości meta do niestandardowego typu postu („zdarzenie”). Niestandardowy typ postu jest wyświetlany w panelu administracyjnym, a niestandardowe pola meta wyglądają dobrze. ja używam save_post_{$post->post_type} hook, aby sprawdzić poprawność pól meta i zmienić post_status Do draft (za pomocą wp_update_post) w zależności od walidacji pól meta i nowo ustawionego post_status.

Problem:

Wszystko działa, z wyjątkiem prawej górnej sekcji (na stronie edycji postu administratora), która nie odzwierciedla zmiany statusu. Jeśli opublikuję post, sprawdzanie poprawności działa dobrze z post_status Ustawić draft w zależności od ustawionych warunków wewnątrz save_post_{$post->post_type}. Jednak w prawym górnym rogu interfejsu użytkownika widać komunikat „post jest już aktywny”, „odwiedź linki” itp. (ekrany nr 1). Po odświeżeniu strony właściwy draft odzwierciedlony jest widok stanu (Ekrany nr 2).

Ekrany nr 1:

Chociaż post_status pomyślnie ustawiono wersję roboczą z save_post_{$post->post_type}widok interfejsu użytkownika odzwierciedla stan „opublikowane”.

Chociaż status post_status został pomyślnie ustawiony na wersję roboczą z save_post_{$post->post_type}, widok interfejsu użytkownika odzwierciedla stan „opublikowany”.”/><br />
<img decoding=


Ekrany nr 2:

Po odświeżeniu rzeczywisty status wersji roboczej zostaje przywrócony:

wprowadź tutaj opis obrazu

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, " );
    

    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']);
    }
}

Notatka:

Warto przeczytać!  php — Problem z interfejsem API ustawień WordPress: formularz zostaje przesłany, gdy pola są wywoływane bezpośrednio, kończy się niepowodzeniem podczas korzystania z wywołań zwrotnych

Próbowałem używać wp_insert_post_data wraz z redirect_post_location co też nie zadziałało.


Źródło