致命错误:调用成员函数GET_QUERED_OBJECT_ID()

时间:2015-02-04 作者:Ari

我尝试使用以下模式显示快捷码:

    class callShortCode {


    function __construct() {
    global $post;
    $this->dos($post);
    }


    private function dos($post){
    global $post;
    $pid = get_the_ID();
    $archive_id = get_queried_object_id();

    if($archive_id == $pid) {
    add_action(\'wp_footer\', array($this, \'show\'));
    }

    }


    // shortcode call
    function show($post) {

    $pid = get_the_ID();
    $archive_id = get_queried_object_id();


    $the_query = new WP_Query( array(\'post_type\' => \'custom_post_type\') );
                    if ($the_query->have_posts()) {
                        while ($the_query->have_posts()){
                        $the_query->the_post();
                          if($pid == $archive_id) {
                            echo do_shortcode("[my_shortcode id=\'5\']");
                          }
                        }
                    }

    }

    }

new callShortCode();
但它在前端返回如下错误:

Fatal error: Call to a member function get_queried_object_id() on a non-object in D:\\xxxx\\xxxx\\xxxxx\\wp-includes\\query.php on line xx
我试着用init 操作,但它不希望读取前端上的当前页面id而不显示任何内容。我已经检查过$pid = get_the_ID();$archive_id = get_queried_object_id(); 使用时返回0init 钩子调用对象。

我还用plugins_loaded 但它返回的是相同的致命错误!

我知道这是因为它叫得太早了!但是我该怎么做才能使它正常工作呢?

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

在连接到template_redirect 措施:

function wpse_177056_init_shortcode() {
    new callShortCode();
}

add_action( \'template_redirect\', \'wpse_177056_init_shortcode\' );

SO网友:cybmeta

当前对象的ID只有在执行实际的主查询之后才可用。而且get_queried_object_id() 使用global $wp_query 对象如果尚未设置此对象,则调用其某些方法或属性将不起作用。

因此,您必须使用get_queried_object_id() 后来符合the codex, 行动挂钩wp 是设置WP对象后第一个可用的。在您的情况下,您还可以使用wp_footer 当您尝试执行快捷码时,请直接执行操作:

class callShortCode {

    function __construct() {
        $this->dos();
    }

  function dos() {
        $archive_id = get_queried_object_id();
        //Replace with your logic
        if( $archive_id === 451) {
            $this->show();
        }
   }

   // shortcode call
   function show() {

      $the_query = new WP_Query( array(\'post_type\' => \'custom_post_type\') );
      if ($the_query->have_posts()) {
          while ($the_query->have_posts()){
              $the_query->the_post();
                   echo do_shortcode("[my_shortcode id=\'5\']");
           }
       }

      wp_reset_postdata();

   }
}

add_action( \'wp_footer\', function() {
    new callShortCode;
});
Note: 我已经删除了$pid == $archive_id 因为实际上我不理解你的逻辑$pid = get_the_ID();get_the_ID() 应返回相同级别的get_queried_object_id() 在单柱视图中。

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴