在哪里挂接我的插件的操作

时间:2016-09-19 作者:Achillx

我正在编写一个插件,每当您:

发布帖子编辑已发布的帖子删除已发布的帖子它对数据库进行多次查询,获取特定帖子数据(标题、摘录、类别、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 ]);哪里$filtercurrent_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文件中删除这篇文章。

2 个回复
最合适的回答,由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);
我希望这能帮助其他人。

SO网友:johnh10

重要的是,当你创建一篇新文章时,WordPress做的第一件事就是自动保存,所以第一次值应该是空的。也许这就是您所经历的-我没有看到您的完整代码,但我确实看到了

自定义元数据的插件挂接在“save\\u post”操作中。

此外,在编辑WordPress时,默认情况下每60秒自动保存一次。因此,也许可以检查代码中的自动保存,或者可以尝试完全禁用自动保存。

function disable_autosave() {
    wp_deregister_script(\'autosave\');
}
add_action(\'wp_print_scripts\',\'disable_autosave\');

相关推荐

即使以管理员身份也无法使用/wp-json/wp/v2/plugins API终结点

以管理员身份使用基本身份验证时,我得到一个错误代码401 Unauthorized : [rest_cannot_view_plugins] Sorry, you are not allowed to manage plugins for this site. 尝试访问GET时出错/wp-json/wp/v2/plugins 我的服务器的终结点。我可以毫无问题地获取帖子和页面信息,但当我查询插件时,我得到了401错误。我已经确认,API调用中使用的用户ID应该能够使用CLI工具管理插件:# wp use