обновить мету публикации() не работает при использовании с действием WordPress
Я пытаюсь обновить поле, когда статус публикации изменится на опубликовано. Он получает значения правильно, но не обновляется, когда я проверяю, какое поле обновления возвращается.
Он показывает какое-то число.
Пожалуйста, помогите, не уверен, следует ли мне использовать это вместе с transition_post_status
Обновление - Я пробовал ниже крючки// действие запускается, но поля не обновляются
1. опубликовать//работает, но нет происходит обновление
2. сохранить сообщение && save_post_l//работает, но обновления не происходит.
add_action('transition_post_status', 'updated_to_publish', 10, 3);
function updated_to_publish($new_status, $old_status, $post)
{
if ($new_status == 'publish')) // I have removed the check for post type
{
$post_id = $post->ID;
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
$metatitle = get_field('seo_title', $post_id);
$metadesc = get_field('seo_meta_description', $post_id);
$metakeywords = get_field('seo_keyword', $post_id);
update_post_meta($post_id, '_yoast_wpseo_title', $metatitle );
update_post_meta($post_id, '_yoast_wpseo_metadesc', $metadesc );
update_post_meta($post_id, '_yoast_wpseo_focuskw', $metakeywords);
}
}
} else {
return;
}
}
Обновление
Я смог решить проблему, используя действие "wp_insert_post
". Могу ли я узнать, почему другие действия не удались, но "wp_insert_post
" сработало?
Код, который я использовал для тестирования
add_action('transition_post_status', 'updated_to_publish', 10, 3);
function updated_to_publish($new_status, $old_status, $post)
{
if (($new_status == 'publish') && ($post->post_type == 'l')) {
$post_id = $post->ID;
error_log( var_export( $post_id, 1 ) );
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
// ACF field
$metatitle = get_field('seo_title', $post_id);
error_log( var_export( $metatitle, 1 ) );
$metadesc = get_field('seo_meta_description', $post_id);
error_log( var_export( $metadesc, 1 ) );
$metakeywords = get_field('seo_keyword', $post_id);
error_log( var_export( $metakeywords, 1 ) );
//plugin is activated
//old values
$metadesc_old = get_post_meta($post->ID, '_yoast_wpseo_metadesc', true);
error_log( var_export( $metadesc_old, 1 ) );
$metatitle_old = get_post_meta($post->ID, '_yoast_wpseo_title', true);
error_log( var_export( $metatitle_old, 1 ) );
$metakeywords_old = get_post_meta($post->ID, '_yoast_wpseo_focuskw', true);
error_log( var_export( $metakeywords_old, 1 ) );
update_post_meta($post_id, '_yoast_wpseo_title', $metatitle, $metatitle_old);
error_log( var_export( $tyone, 1 ) );
update_post_meta($post_id, '_yoast_wpseo_metadesc', $metadesc, $metadesc_old);
error_log( var_export( $tytwo, 1 ) );
update_post_meta($post_id, '_yoast_wpseo_focuskw', $metakeywords, $metakeywords_old);
error_log( var_export( $tythree, 1 ) );
}
}
} else {
return;
}
//Do something
}
3 answers
Итак, я установил SEO-плагин Yoast и протестировал ваш код, и теперь я могу с уверенностью сказать " ни "нет", ни "да", но вы могли бы" на этот вопрос:
Пожалуйста, помогите, не уверен, следует ли мне использовать это вместе с
transition_post_status
transition_post_status
запускается до запуска действия wp_insert_post
, и плагин Yoast SEO фактически сохраняет (добавляет/обновляет) все свои пользовательские поля с помощью действия wp_insert_post
:
// See WPSEO_Metabox::save_postdata() (in wordpress-seo/admin/metabox/class-metabox.php)
add_action( 'wp_insert_post', array( $this, 'save_postdata' ) );
Так что ваш сам код работает, и поля обновляются (если новые и текущие значения не совпадают и, конечно, выполняются все условия if
); однако плагин Yoast SEO переопределяет значение с помощью функции WPSEO_Metabox::save_postdata()
, которая должна ответить на этот вопрос:
Я смог решить проблему, используя действие "
wp_insert_post
". Мочь Я знаю, почему другие действия не удались, но "wp_insert_post
" сработало?
Почему я сказал ни "нет", ни "да", но ты мог бы?
Потому что вы можете использовать transition_post_status
вместе с wp_insert_post
вот так:
add_action( 'transition_post_status', 'do_updated_to_publish', 10, 2 );
function do_updated_to_publish( $new_status, $old_status ) {
if ( $new_status !== $old_status && 'publish' === $new_status ) {
add_action( 'wp_insert_post', 'updated_to_publish', 10, 2 );
}
}
function updated_to_publish( $post_id, $post ) {
// Remove it; it will be re-added via the do_updated_to_publish() function,
// if necessary or when applicable.
remove_action( 'wp_insert_post', 'updated_to_publish', 10, 2 );
if ( ! defined( 'WPSEO_VERSION' ) || 'l' !== $post->post_type ) {
return;
}
if ( get_field( 'advanced_option_edit_seo', $post_id ) ) {
// Make your update_post_meta() calls here.
update_post_meta( $post_id, '_yoast_wpseo_focuskw', 'test' );
error_log( 'focuskw updated for post #' . $post_id );
}
}
Проверенная и проверенная работа с Yoast SEO версии 9.1.
Попробуйте фильтр "wpseo_title" для обновления wpseo_title.
add_filter('wpseo_title', 'filter_product_wpseo_title');
function filter_product_wpseo_title($title) {
global $post;
$post_id = $post->ID;
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
$title = get_field('seo_title', $post_id);
}
}
return $title;
}
Для получения дополнительной информации об обновлении данных seo пример: https://yoast.com/wordpress/plugins/seo/api/
Ваша исходная функция основана на том, что для параметра $_POST['post_type'] установлено соответствующее значение. Как правило, вам следует избегать использования глобальных переменных - если вы используете только то, что вам дает функция, вам не нужно думать о контекстах, в которых она должна называться.
В данном случае именно это и произошло. Ваша функция зависит от глобальной переменной $_POST['post_type'], и хотя она работает в одном "состоянии" (публикация сообщения), в другом она не работает (задание cron, обновление поста). Короче говоря, $_POST['post_type'] не всегда то, что вы думаете, должно быть.
Следующее извлекает тип записи из переданной переменной $post:
add_action('transition_post_status', 'updated_to_publish', 10, 3);
Функция updated_to_publish($new_status, $old_status, $post) Функция обновленная_публикация ($new_status, $old_status, $post) {
if (($new_status == 'publish') && (get_post_type( $post ) == 'l')) {
$post_id = $post->ID;
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
//Code goes here
}
}
} else {
return;
}
}
Перейдите по этой ссылке, откуда я только что скопировал ответ