数据库中的‘POST_CONTENT_FIRTED’列何时被WordPress清除?

时间:2013-09-08 作者:its_me

一些WordPress插件(虽然很少)使用post_content_filtered 列以保存与帖子相关的一些数据。

例如Markdown on Save 将贴子的降价版本分别存储在post_content_formatted 列和post_content 列,这样当插件被停用时,帖子就不会出现降价(因为HTML存储在post_content).

现在,我意识到post_content_filtered 几乎用于临时存储,即在以下情况下,列中的内容丢失(或清除):

您可以使用“快速编辑”选项更改帖子(标题、标签、类别等)

计划的帖子(自动)发布

对帖子进行批量编辑

您可以在帖子的修订版本之间切换

从外部编辑器(即不是WordPress post编辑器)保存帖子

Questions:

<在其他什么情况下post_content_filtered 是否清除列?

有没有办法阻止这种情况发生?(我的意思是,有没有一种方法可以确保数据永久存储post_content 柱是否已处理?)

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

WordPress中的每个帖子更新都由wp_update_post 作用

此函数有一些默认值post_content_filtered 默认值为“”(空字符串)。

默认值与通过传递给函数的参数合并后wp_parse_args 这意味着每次更新帖子post_content_filtered 未显式传递,它设置为空字符串。

现在我们可以问:什么时候post_content_filtered 显式传递给wp_update_post? 答案是:WordPress永远不会。

因此,对于您的第一个问题:

在其他哪些情况下,post\\u content\\u filtered列中的数据会被清除?

简单的回答是:every time a post is updated, for any reason.

请注意,仅更改一个字段是更新,尤其是每个状态更改都是更新,例如,要发布的草稿、待发布、要发布的未来、发布到垃圾箱(后期删除)等。。。

如果帖子中发生了变化post_content_filtered 已清除;唯一的例外是post_content_filtered 显式传递给wp_update_post, 正如前面所说的,WordPress从来没有这样做过。

有没有办法阻止这种情况发生?(我的意思是,有没有办法确保数据永久存储?

如果您使用代码创建该字段,并且希望保留它,那么您必须查看every 由WordPress执行更新,并阻止更改。

这听起来很难,但如果你读了这个答案中的第一句话,“WordPress中的每个帖子更新都是由wp_update_post 函数“,您知道唯一需要做的就是查看该函数,幸运的是它有不同的挂钩。

我建议的钩子是wp_insert_post_data 原因有二:

它在更新之前运行,因此您不必恢复,但您可以防止它传递2个参数:函数将要更新的数据和传递的参数数组,这些参数(在更新的情况下)包含帖子的IDget_post 你可以比较现在的帖子和将来的帖子:如果你不喜欢某样东西,你可以改变它。

让我们编码:

add_filter( \'wp_insert_post_data\', \'preserve_content_filtered\', 999, 2 );

function preserve_content_filtered ( $data, $postarr ) {

    /* If this is not an update, we have nothing to do */
    if ( ! isset($postarr[\'ID\']) || ! $postarr[\'ID\'] ) return $data;

    /*
     * Do you want you filter per post_type?
     * You should, to prevent issues on post type like menu items.
     */
    if ( ! in_array( $data[\'post_type\'], array( \'post\', \'page\' ) ) ) return $data;

    /* How post is now, before the update */
    $before = get_post( $postarr[\'ID\'] ); 

    /* If content_filtered is already empty we have nothing to preserve */
    if ( empty( $before->post_content_filtered ) ) return $data;

    if ( empty( $data[\'post_content_filtered\'] ) ) {
        /*
         * Hey! WordPress wants to clear our valuable post_content_filtered...
         * Let\'s prevent it!
         */
        $data[\'post_content_filtered\'] = $before->post_content_filtered;
    }

    return $data;

}
存在一个可能的问题,前面的功能阻止every post_content_filtered 清洁。如果you, 出于任何原因,想清除它吗?

我说过,每一次WP岗位变更都是由wp_update_post, 但你不是WordPress。

您可以编写如下函数:

function reset_post_content_filtered( $postid ) {
    global $wpdb;
    $wpdb->query( $wpdb->prepare(
        "UPDATE $wpdb->posts SET `post_content_filtered` = \'\' WHERE `ID` = %d", $postid
    ) );
}
成为$wpdb 查询时,它不会触发我们的过滤器,因此重置是毫无问题的,并且在代码中的任何地方都需要重置post_content_filtered, 您可以调用此函数。

您还可以创建一个带有“清除已过滤内容”按钮的元盒,单击此按钮时,只需调用您的reset_post_content_filtered 功能,例如通过Ajax。

结束

相关推荐

自定义WP_POSTS_LIST_TABLE类

如何在wp admin/edit中自定义记录表的输出。php?有哪些选项可供编辑display_tablenav(\'top\') 和display_tablenav(\'bottom\') 在课堂上输出之前WP_Posts_List_Table?我想在显示记录的表格和过滤器之间插入我的块,例如:<h3>Titlle</h3>. 不管怎样。法典中写道:此类的访问被标记为私有。这意味着它不适用于插件和主题开发人员,而仅适用于其他核心函数和类。也许有某种方法不会改变内核。