WordPress как на ладони

Плагин «не видит» некоторые поля поста

Тема alezhu как дочерняя к inspiro
Плагин alezhu-vk-poster как fork (copy-paste) плагина vk-poster-group

Вопрос №1:
Файл ../themes/alezhu/functions.php

function my_words_metabox( $post ){

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

	if( $words ){
		echo '';
		foreach( $words as $word ){
			echo 'ID .'" '. selected($word->ID, $post->post_parent)  .'>'.esc_html($word->post_title).'';
		}
		echo '';
	}
	else
		echo 'просто нет слов!';
}

НО! Функции "сохранить значение" нет!! При этом, значение "post_parent" прекрасно сохраняется в поле "post_parent" сохраняемого поста.
Вопрос: почему?

Предположение: где то есть стандартная операция «сохранить пост», и так как в конструкции '' используется дефолтное имя поля, эта стандартная функция его подхватывает и правильно сохраняет в таблицу постов.

Вопрос №2:

В плагине alezhu-vk-poster (который просто fork плагина vk-poster-group), в функцию публикации поста пытаюсь добавить:

$author = get_the_author_meta('display_name', $postData->post_author);
$words =  $postData->post_parent;

При этом, автор прекрасно публикуется, а вот переменная $words упорно возвращает 0.
Такое впечатление, что в момент публикации в ВК это поле еще не записано. Что странно, если предположение из вопроса №1 верно. Ведь все остальные значения уже сохранены?

Тогда я сделал так:
В Файл ../themes/alezhu/functions.php добавляем:

add_action( 'save_post', 'myplugin_save_postdata', 9 );

function myplugin_save_postdata( $post_id ) {
// всякие проверки пропущены для краткости

$my_data = sanitize_text_field( $_POST['post_parent'] );
	// Обновляем данные в базе данных.
	$postData = get_post($my_data);
	$words = $postData->post_title;
	update_post_meta( $post_id, 'alezhu_meta_key', $words );
};

Смотрим в базе: мета поле присутствует.

В функцию публикации поста в ВК в плагине alezhu-vk-poster добавляем:

$words = get_post_meta($post_id, 'alezhu_meta_key', true );

Но переменная $words упорно возвращает «пусто»
Вопрос: почему?

Предположение: вообще-то никаких, кроме того, что сохранение мета поля происходит уже после публикации всё таки. Но я вроде бы повысил приоритет функции сохранения метя поля? Что же тогда не так?

Буду признателен за помощь, и указание на разделы документации, которые я пропустил.

0
Александр
5 месяцев назад
  • 0
    Kama9622

    Давайте разберемся с вашими вопросами.

    Вопрос №1:

    Код, который вы предоставили, предназначен для отображения списка слов в метабоксе, но не содержит логики сохранения значений. Ваше предположение о том, что WordPress автоматически сохраняет значение post_parent в таблице постов при сохранении поста, верно. Но в вашем коде нет явного сохранения значения в метаполе. Для того чтобы сохранить значение в метаполе, вы должны использовать функцию update_post_meta или add_post_meta. Возможно, вы не предоставили весь код, и логика сохранения где-то еще, но из предоставленного кода этого не видно.

    Вопрос №2:

    Если ваша переменная $words возвращает "пусто" после публикации поста в ВК, это может быть связано с тем, что вы используете get_post_meta для получения значения. Ваш код обновления метаполя выполняется при событии save_post, но возможно, ваши изменения еще не применены к моменту вызова get_post_meta в функции публикации поста в ВК. Вам может потребоваться использовать хук, который вызывается после сохранения метаполей, чтобы убедиться, что значения актуальны.

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

    add_action( 'save_post', 'myplugin_save_postdata', 99 );

    Также удостоверьтесь, что $post_id в функции публикации поста в ВК действительно соответствует тому посту, который вы хотите проверить.

    Если это не помогает, проверьте порядок выполнения хуков и убедитесь, что ваш хук выполняется после сохранения значений в метаполе. Может быть полезно использовать инструменты отладки, такие как error_log, чтобы отслеживать значения переменных и порядок выполнения кода.

    Александр 4 месяца назад

    добавил сохранение значения (файл functions.php):

    add_action( 'save_post', 'myplugin_save_postdata', 5 );
    
    function myplugin_save_postdata( $post_id ) {
    	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
    		return;
    	if( ! current_user_can( 'edit_post', $post_id ) )
    		return;
    
    	// Все ОК. Теперь, нужно найти и сохранить данные
    	$action = $_POST['action'];
    	$original_post_status = $_POST['original_post_status'];
    	$post_status = $_POST['post_status'];
    	$post_array=isset($_POST);
    	$Parent_post_ID = $_POST['post_parent'];
    	$Parent_post = get_post($Parent_post_ID);
    	$words = $Parent_post->post_title;
    	$resultat = update_post_meta( $post_id, 'alezhu_meta_key', $words );
    	error_log("file functions.php/main post ID:$post_id/post_parent ID:$Parent_post_ID/post_array:$post_array/action:$action/original_post_status:$original_post_status/post_status:$post_status \n", 0);
    };

    убедились, что VK плагин срабатывает раньше, чем myplugin_save_postdata():

    [Fri Dec 01 17:51:37 2023]  file functions.php/main post ID:7748/post_parent ID:/post_array:1/action:/original_post_status:/post_status: \n, 
    [Fri Dec 01 17:51:41 2023]  file functions.php/main post ID:7750/post_parent ID:/post_array:1/action:/original_post_status:/post_status: \n, 
    [Fri Dec 01 17:54:00 2023]  VK plugin-services.php/main post ID:7750/post parent ID:0/title:test1-2/words1:/words2: \n,
    [Fri Dec 01 17:54:00 2023]  file functions.php/main post ID:7751/post_parent ID:/post_array:1/action:/original_post_status:/post_status: \n, 
    [Fri Dec 01 17:54:00 2023]  file functions.php/main post ID:7750/post_parent ID:/post_array:1/action:/original_post_status:/post_status: \n, 
    [Fri Dec 01 17:54:01 2023]  file functions.php/main post ID:7750/post_parent ID:6940/post_array:1/action:editpost/original_post_status:auto-draft/post_status:publish \n, 

    но вопросов стало только больше:
    №1 - почему моя function myplugin_save_postdata() срабатывает аж пять раз (первая строка, это просто открытие редактора с предыдущим постом)
    №2 - я поставил приоритет "5", что согласно документации, сильно выше дефолтного "10", но это не помогает.

    контекстным поиском по VK плагину по строке "add_action(" нашёл следующее:

    ../src/Coderun/CorePlugin.php:
    	public function addEvents()
    	{
    		add_action( 'transition_post_status', [$this, 'transition_post_status'], 10, 3 );
    		...
    <есть и другие вхождения, но они не походи на то что ищем>
    
    ../src/Coderun/ServicesAjax.php:
    	public function addEventListener()
    	{add_action('wp_ajax_coderun_send_post_to_vk', array($this, 'sendPostToVk'));}
    	public function sendPostToVk() {...
    
    ../index-vkp.php:
    add_action('init', 'coderun_vk_poster_group');
    function coderun_vk_poster_group() {.....
    

    и продожение вопросов:
    №3 - приоритеты в VK плагине указаны "10" или не указаны, то есть, они должны быть ниже, чем у меня (5)
    №4 - возможно вместо "add_action()" надо искать что-то другое в VK плагине, что бы понять почему он срабатывает раньше чем у меня?

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

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

    нашел ответ на вопрос №2, путём замены вызова
    add_action( 'save_post', 'myplugin_save_postdata', 5 );
    на
    add_action( 'transition_post_status', 'myplugin_save_postdata', 9, 3 );
    видимо, хук на 'transition_post_status' срабатывает раньше, чем хук 'save_post', даже не смотря на явно указанный приоритет.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация