Admin: global $post empty

时间:2015-03-13 作者:freaky

我试图在wordpress管理面板中的php函数外部获取$post var。我发现访问$post的唯一方法是添加\\u操作。

然而,我想在add\\u操作之外得到这个var,而全局var似乎在add\\u操作中不起作用。

如何在函数外部的管理面板中获取$post。php。

我在几个小时内搜索,但找不到解决方案。。。

编辑:示例

require_once(TP_PLUGIN_PATH . \'includes/my-file-framework.php\' ); // it\'a a metabox framework
require_once(TP_PLUGIN_PATH . \'includes/my-file-config.php\' ); // I load the     file that include metabox array to build metabox

class The_plugin_Admin {

    public function __construct() {
       add_action( \'pre_get_posts\', array($this, \'the_metabox\' ));
    }

    public function the_metabox() {
        apply_filters( \'the_metabox_setup\',\'\');
    }

}

new The_plugin_Admin;
和我的文件配置。php,我想在其中检索Wordpress global:

 add_filter( \'the_metabox_setup\', \'the_metabox_setup_callback\' );
 function the_metabox_setup_callback() {
      global $post;
      print_r($post); //empty
      $post_ID = isset($_GET[\'post\']) ? $_GET[\'post\'] : 0;
      echo $post_ID; // empty on new post because not already set

      $post_types = get_post_types(array(\'public\' => true), \'names\', \'and\'); // no get all post type on the first time, need to loop again to get all

      $an_array[] = array(......);
      $an_array[] = array(......);
      $an_array[] = array(......);
      $an_array[] = array(......);

      foreach ($an_array as $array) {
           new The_Metabox($array); // contruct my metabox, the class was declared previous in my-file-framework.php
      }

 }

1 个回复
SO网友:kaiser

基本的错误是,在编写代码时,每个数据都是可用的。事实并非如此,存在挂钩是为了在core loading procedure graph.

简而言之,非常简单的东西like 这是:

# core loads
// ...more stuff...
# point at where all must-use-plugins are loaded - first entry point
do_action( \'muplugins_loaded\' );
// ...more stuff...
# point at where all plugins are loaded - second entry point
do_action( \'plugins_loaded\' );
// ...more stuff...
# main core stuff available - use this hook instead of `init` for multisite plugins
do_action( \'wp_loaded\' );
// ...more stuff...
# themes functions.php files loaded - use this hook for theme stuff
do_action( \'after_setup_theme\' );
// ...rendering happens...
在两者之间的某个地方,WP core设置(填充数据)不同global全局变量中的可用数据集。有些是在呈现流期间定义的,有些是在呈现流之前定义的,等等。换句话说,当您编写插件并在野外删除代码时(不是在连接到挂钩或过滤器的回调中),那么它将出现在哪里是非常不确定的。在你之前的例子中plugins_loaded 被调用。结果要么是一个PHP错误(未定义的变量),要么只是一个空值,因为变量没有填充。

结论:Always! 将代码放入附加到(适当的)挂钩和过滤器的回调中。在大多数情况下,这意味着需要进行一些散弹枪式的调试,并将回调附加到不同的钩子/过滤器,这些钩子/过滤器是您在遵循核心加载过程读取核心文件时发现的。

访问admin中可用数据的捷径,以及通过wecodemore/"Current Admin Info"-Plugin.

结束