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。