Плагин «не видит» некоторые поля поста
Тема 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):
убедились, что VK плагин срабатывает раньше, чем myplugin_save_postdata():
но вопросов стало только больше:
№1 - почему моя function myplugin_save_postdata() срабатывает аж пять раз (первая строка, это просто открытие редактора с предыдущим постом)
№2 - я поставил приоритет "5", что согласно документации, сильно выше дефолтного "10", но это не помогает.
контекстным поиском по VK плагину по строке "add_action(" нашёл следующее:
и продожение вопросов:
№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', даже не смотря на явно указанный приоритет.