обновить мету публикации() не работает при использовании с действием 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
    }
Author: Latheesh V M Villa, 2018-11-08

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.

 2
Author: Sally CJ, 2018-11-15 01:29:20

Попробуйте фильтр "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/

 0
Author: mithun raval, 2018-11-11 17:36:45

Ваша исходная функция основана на том, что для параметра $_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;
}

}

Перейдите по этой ссылке, откуда я только что скопировал ответ

 0
Author: Kanon Chowdhury, 2018-11-12 13:21:11