pole niestandardowe — Ustaw status postu na wersję roboczą po sprawdzeniu poprawności wartości meta postu w haku save_post
![pole niestandardowe — Ustaw status postu na wersję roboczą po sprawdzeniu poprawności wartości meta postu w haku save_post](https://oen.pl/wp-content/uploads/2023/01/apple-touch-icon@2.png)
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”.
Ekrany nr 2:
Po odświeżeniu rzeczywisty status wersji roboczej zostaje przywrócony:
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:
Próbowałem używać wp_insert_post_data
wraz z redirect_post_location
co też nie zadziałało.