我正在编写一个插件,每当您:
发布帖子编辑已发布的帖子删除已发布的帖子它对数据库进行多次查询,获取特定帖子数据(标题、摘录、类别、id、url等),并导出JSON文件。这个我在前端使用它来绘制所有元素。
我在管理面板中还有一些自定义元数据库,您可以在其中添加一些自定义元数据。
My problem now
每次我创建一个新帖子
publish it directly - without saving it first (否则导出工作正常),JSON文件中包含自定义元数据数据的数组为空。如果我通过myPhpAdmin检查数据库,则会存储这些值。自定义元数据的插件挂接在“save\\u post”操作中。导出为JSON的插件挂接在“publish\\u post”操作中。
我甚至在插件中有这个功能,可以找到优先级最高的动作,然后把我的放在后面。
function get_latest_priority( $filter )
{
if ( empty ( $GLOBALS[\'wp_filter\'][ $filter ] ) ){
return PHP_INT_MAX;
}
$priorities = array_keys( $GLOBALS[\'wp_filter\'][ $filter ] );
$last = end( $priorities );
return $last+1;
}
function export_posts_in_json (){
function register_plugin (){
add_action( \'publish_post\', \'export_posts_in_json\', get_latest_priority( current_filter() ), 1);
}
add_action( \'publish_post\', \'register_plugin\', 0 );
这就是
var_dump( $GLOBALS[\'wp_filter\'][ $filter ]);
哪里
$filter
是
current_filter()
打印输出:
array(2) {
[0]=>
array(1) {
["register_custom_save"]=>
array(2) {
["function"]=>
string(20) "register_custom_save"
["accepted_args"]=>
int(1)
}
}
[5]=>
array(1) {
["_publish_post_hook"]=>
array(2) {
["function"]=>
string(18) "_publish_post_hook"
["accepted_args"]=>
int(1)
}
}
}
所以我把6作为优先事项。
到底为什么它不起作用?我应该把它挂起来吗?问题是在自定义元数据插件中还是在导出插件中?
如果你需要完整的插件,请告诉我,但我认为没有必要,因为当帖子已经保存在数据库中时,它就可以工作了。
UPDATE
我已将插件挂接到具有更高优先级的“save\\u post”,并且仅当当前帖子的$post\\u状态为“publish”时,导出功能才会运行。
function check_status( $post ){
$p = get_post( $post );
$p_status = $p->post_status;
if($p_status == \'publish\'){
export_posts_in_json();
}
}
add_action( \'save_post\', \'check_status\', 20, 1 );
但这并不能解决问题。我无法捕获当前帖子的状态是否从发布更改为草稿。这个
export_posts_in_json()
函数仅查询已发布的帖子。因此,如果我能够针对上述情况运行它,我将设法从JSON文件中删除这篇文章。
最合适的回答,由SO网友:Achillx 整理而成
我在回答我自己的问题,但经过大量的研究、尝试和错误,我找到了一个解决方案。
我正在使用transition\\u post\\u status操作挂钩来查找帖子状态的更改。由于此操作在save\\u post one之前运行,并且我的自定义元数据尚未保存在数据库中,因此我不会直接调用导出函数。相反,我调用了add\\u操作,挂接在save\\u帖子中,并给它一个稍后的优先级,以便首先将所有内容保存到数据库中。
function check_status( $new_status, $old_status, $post ){
if ( $post->post_type == \'post\'){
//if the posts gets unpublished
if ( $old_status == \'publish\' && $new_status != \'publish\' ){
add_action( \'save_post\', \'export_posts_in_json\', 20, 1 );
}
//if the post gets published, regardless of the previous status
elseif ( $new_status == \'publish\' ){
add_action( \'save_post\', \'export_posts_in_json\', 20, 1 );
}
}
}
add_action( \'transition_post_status\', \'check_status\', 10, 3);
我希望这能帮助其他人。