Плагин «не видит» некоторые поля поста
Тема 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 упорно возвращает «пусто»
Вопрос: почему?
Предположение: вообще-то никаких, кроме того, что сохранение мета поля происходит уже после публикации всё таки. Но я вроде бы повысил приоритет функции сохранения метя поля? Что же тогда не так?
Буду признателен за помощь, и указание на разделы документации, которые я пропустил.
Давайте разберемся с вашими вопросами.
Вопрос №1:
Код, который вы предоставили, предназначен для отображения списка слов в метабоксе, но не содержит логики сохранения значений. Ваше предположение о том, что WordPress автоматически сохраняет значение post_parent в таблице постов при сохранении поста, верно. Но в вашем коде нет явного сохранения значения в метаполе. Для того чтобы сохранить значение в метаполе, вы должны использовать функцию update_post_meta или add_post_meta. Возможно, вы не предоставили весь код, и логика сохранения где-то еще, но из предоставленного кода этого не видно.
Вопрос №2:
Если ваша переменная $words возвращает "пусто" после публикации поста в ВК, это может быть связано с тем, что вы используете get_post_meta для получения значения. Ваш код обновления метаполя выполняется при событии save_post, но возможно, ваши изменения еще не применены к моменту вызова get_post_meta в функции публикации поста в ВК. Вам может потребоваться использовать хук, который вызывается после сохранения метаполей, чтобы убедиться, что значения актуальны.
В вашем случае можно использовать хук save_post, но убедитесь, что ваш код обновления метаполя выполняется раньше кода плагина, который использует это значение. Попробуйте увеличить приоритет вашего хука:
Также удостоверьтесь, что $post_id в функции публикации поста в ВК действительно соответствует тому посту, который вы хотите проверить.
Если это не помогает, проверьте порядок выполнения хуков и убедитесь, что ваш хук выполняется после сохранения значений в метаполе. Может быть полезно использовать инструменты отладки, такие как error_log, чтобы отслеживать значения переменных и порядок выполнения кода.
добавил сохранение значения (файл 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():
но вопросов стало только больше:
№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 плагине, что бы понять почему он срабатывает раньше чем у меня?
заранее спасибо за помощь, благодаря ей, я уже узнал больше чем знал до этого.
нашел ответ на вопрос №2, путём замены вызова
add_action( 'save_post', 'myplugin_save_postdata', 5 );
на
add_action( 'transition_post_status', 'myplugin_save_postdata', 9, 3 );
видимо, хук на 'transition_post_status' срабатывает раньше, чем хук 'save_post', даже не смотря на явно указанный приоритет.