获取有关SAVE_POST操作的更新POST元吗?

时间:2021-09-22 作者:Key

当通过创建或更新帖子时,我正在尝试将帖子id和关键字(Yoast Focus关键字)保存到自定义表中save_post 行动它可以在发布时(第一次)保存所有内容,但当我更新帖子时,它会从数据库中获取focus关键字的旧值,而不会保存新值。

例如,Focus关键字(Publish)=";“你好,世界”;(工作正常,关键字存储正确)Focus keyword(第一次更新)=";“你好”;(不工作并在自定义表中保留“Hello World”)Focus关键字(第二次更新)=“Hello World”;“你好”;(它可以保存“Hello”)

所以基本上,问题是get\\u post\\u meta($post\\u id,“\\u yoast\\u wpseo\\u focuskw”,true)返回的是数据库中已经存在的值,而不是正在保存的新值。

通过以下方式保存帖子时,获取新价值的最佳方式是什么save_post 行动

$\\u POST[\'\\u yoast\\u wpseo\\u focuskw\']无法工作,因为yoast Focus关键字输入字段未在输入字段上设置名称。Screenshot

任何帮助都将不胜感激。谢谢

这是我的密码。

add_action(\'save_post\', \'my_custom_table\');
function my_custom_table($post_id) {
    global $wpdb;
    $table_name = $wpdb->prefix . "custom_table";

    $data = [
        \'post_id\' => $post_id,
        \'keyword\' => get_post_meta( $post_id, \'_yoast_wpseo_focuskw\', true )
    ];

    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) {
        return;
    } else {

        //check if new post so insert
        if( strpos( wp_get_raw_referer(), \'post-new\' ) > 0 ) {

            if (get_post_status($post_id) === \'publish\') {

                $wpdb->insert( 
                    $table_name, 
                    $data
                );

            }

        } else {

            $wpdb->update( 
                $table_name, 
                $data,
                array( 
                    \'post_id\' => $post_id
                ),
                array( \'%d\', \'%s\' ),
                array( \'%d\' )
            );
        }

    }

}

2 个回复
最合适的回答,由SO网友:Linnea Huxford 整理而成

WordPress激发updated_{$meta_type}_meta 更新元数据后激发的挂钩。在你的情况下,钩子是updated_post_meta 您可以让函数在该挂钩上运行,而不是save_post

SO网友:kovshenin

这真的取决于什么时候_yoast_wpseo_focuskw 实际上是在您使用的插件中编写/更新的。这就是我要开始的地方。尝试跟踪它,它是否也写在post\\U save上?还是更早?可能以后吧。在附近的某个地方WPSEO_Meta::set_value() #, 可以从那里回溯。

然后调整代码以适应这种情况,在写入新值后对正在执行的任何操作进行排队。

相关推荐

WPDB: Update table

我目前正在开发我的第一个WordPress插件,目前对如何更改数据库中的记录有点困惑。到目前为止,我已经使用$wpdb::update()函数解决了这个问题:public function toggle_status() { global $wpdb; $id = (int) $_POST["id"]; $active = (int) $_POST["active"]; $tablename = $wp