Пустой $_POST?

почему я упорно не могу получить значение из $_POST?
мне нужен $_POST['post_parent'], но такое впечатление, что $_POST пустой совсем.

mytheme/function.php

add_action('add_meta_boxes', function () {
	add_meta_box( 'my_words', 'слова', 'my_words_metabox', 'post', 'side', 'low'  );
});

// Метабокс с выбором слов
function my_words_metabox( $post ){

	$words = get_posts(array( 'post_type'=>'words', 'posts_per_page'=>-1, 'orderby'=>'post_title', 'order'=>'ASC' ));

	if( $words ){

		echo '<select name="post_parent">';
		echo '<option value="0">без слов</option>';
		foreach( $words as $word ){
			echo '<option value="'. $word->ID .'" '. selected($word->ID, $post->post_parent)  .'>'.esc_html($word->post_title).'</option>';
		}
		echo '</select>';

	}
	else
		echo 'просто нет слов!';
}

add_action( 'transition_post_status', 'alezhu_save_postdata', 9, 3 );

	function alezhu_save_postdata($new_status, $old_status, \WP_Post $post)
	{
		if ($new_status !== 'publish' || $old_status == 'publish') {return;}
		if ($new_status === $old_status) {return;}

		$stringed_var = implode(',', $_POST);
		update_post_meta( $post->ID, 'alezhu_meta_key',$stringed_var);
	}

в мета поле 'alezhu_meta_key' - пустая строка.
голову сломал.

Заметки к вопросу:
Kama 4 месяца назад

Скорее всего событие transition_post_status запускается уже после того как был обработан пост запрос (в другом запросе). И по коду я не вижу где вы вообще меняете post_statud, чтобы это событие запускалось.

alezhu 4 месяца назад

я вешаю хук на событие 'transition_post_status', который срабатывает, как я понял, при любом изменении статуса поста. поэтому в хук (как я понял) передаются два параметра: старый статус и новый статус. и в зависимости от их сочетания, идёт обработка события.
почему, например, не классический save_post, как вот в этом примере:

add_action( 'save_post', 'wp_kama_save_post_action', 10, 3 );

потому что у меня стоит плагин VK Poster Group, который висит именно на 'transition_post_status'
и что бы мой код сработал раньше этого плагина, и приходится использовать 'transition_post_status' с более высоким приоритетом - (9)
как мне удалось выяснить экспериментальным путём, 'transition_post_status' срабатывает ДО события 'save_post' с любым приоритетом.
вот в таком порядке:

1. add_action( 'transition_post_status', 'save_post_action', 10, 3 );
2. add_action( 'save_post', 'save_post_action', 5, 3 );
3. add_action( 'save_post', 'save_post_action', 10 , 3 );

в общем, я был уверен, что менять мне вручную post_status вообще не надо, и даже вредно, так как это делает само ядро.
я не прав?

отключил все плагины. проверил. переменная $_POST пустая всё равно.
буду искать контексным поиском кто и где ее трогает....

alezhu 4 месяца назад

заработало. но это какой то бред.

add_action( 'transition_post_status', 'alezhu_save_postdata', 9, 3 );

	function alezhu_save_postdata($new_status, $old_status, \WP_Post $post)
	{
		//if ($new_status != 'publish' || $old_status == 'publish') {return;};
		//if ($new_status == $old_status) {return;};

		$Parent_post_ID = $_POST['post_parent'];
		$Parent_post = get_post($Parent_post_ID);
		$words = $Parent_post->post_title;
		update_post_meta( $post->ID, "alezhu_$new_status" , $words);
	}

получаем картину:

если расскоментировать любой из if, переменная $_POST становится пустой:

(на скриншоте ниже расскоментирован второй if:

какой то бред. то ли я... то ли лыжи...

Kama 4 месяца назад

У тебя статус не меняется, поэтому обе проверки обламывают запрос. Все логично.

в общем, я был уверен, что менять мне вручную post_status вообще не надо, и даже вредно, так как это делает само ядро.

Ядро статус не меняет, если он не меняется...

Вообще, все что ты делаешь выглядит странно, судя по коду тебе нужно обновить метаполе всякий раз когда обновляется пост.

Если тебе нужно именно пост мету побновлять, то у самой функции update_post_meta() есть хуки.

Тебе как минимум нужно добавить проверку есть ли вообще в $_POST то что тебе нужно, предже чем что-то делать.

И еще.

  • старайся не юзать $_POST если это возможно
  • если юзаеш чисти данные при принятии
alezhu 4 месяца назад

Спасибо! код выглядит странно, потому что сделан для целей траблшутинга.
статус меняется (ядром, при сохранении поста). Почему я в этом уверен:
есть вот такая строка, где в имени метаполя используется новый статус поста:
update_post_meta( $post->ID, "alezhu_$new_status" , $words);
на скриншоте видно, что создаются метаполя:
alezhu_auto_draft = NULL
alezhu_publish = "тут что-то записано"
alezhu_inherit = NULL

то есть моя функция отрабатывает три раза при трёх новых статусах. всё как ожидалось.
метаполе получает нужное значение из $_POST, но только при переходе в статус publish (странно, но ладно, может так задумано), так как значение есть только в таком поле.

вот чего я не могу понять, так это почему если раскоментировать проверку статусов (if), то метаполе перестаёт получать значение... совсем? но при этом само поле то создается, то есть ветка кода отрабатывает успешно.

про остальное - спасибо. пошел читать документацию.

alezhu 4 месяца назад

всё, последний вопрос.
максимально упрощённый код, только что бы показать прблему:

add_action( 'transition_post_status', 'alezhu_save_postdata', 9, 3 );

	function alezhu_save_postdata($new_status, $old_status, \WP_Post $post)
	{
		// две следующие строки только для отладки.
		$Parent_post_ID = $_POST['post_parent'];
		error_log( print_r( "$old_status -> $new_status -> $Parent_post_ID", true ) ); 
	}

получаем вот такой лог:

[notice] new -> auto-draft -> , referer https://three-words.ru/wp-admin/edit.php?post_type=post
[notice] auto-draft -> publish -> , referer https://three-words.ru/wp-admin/post-new.php
[notice] new -> inherit -> , referer https://three-words.ru/wp-admin/post-new.php
[notice] publish -> publish -> 6940, referer https://three-words.ru/wp-admin/post-new.php

почему значение 6940 (то есть значение переменной $_POST['post_parent']) появляется только на таком странном переходе publish to publish?
почему $_POST не определена на этапе auto-draft -> publish?

PS. (свою задачу я все таки решил, перевесив все нужные мне события на переход publish to publish, но это как то ... не аккуратненько...)
PPS. в продакшене очистка данных добавлена.