Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 将WordPress循环放入类中_Class_Php_Wordpress - Fatal编程技术网

Class 将WordPress循环放入类中

Class 将WordPress循环放入类中,class,php,wordpress,Class,Php,Wordpress,我试图为WordPress开发人员构建一个框架,帮助他们更高效、更快地开发主题和主题框架 然而,通过将wordpress循环放入一个类中,我遇到了一个小问题,这就是我所拥有的: class AisisCore_Template_Helpers_Loop{ protected $_options; public function __construct($options = null){ if(isset($options)){ $thi

我试图为WordPress开发人员构建一个框架,帮助他们更高效、更快地开发主题和主题框架

然而,通过将wordpress循环放入一个类中,我遇到了一个小问题,这就是我所拥有的:

class AisisCore_Template_Helpers_Loop{

    protected $_options;

    public function __construct($options = null){
        if(isset($options)){
            $this->_options = $options; 
        }
    }

    public function init(){}

    public function loop(){
        if(have_posts()){
            while(have_posts()){
                the_post();
                the_content();
            }
        }
    }
}
现在请记住这个类的简单性。你所要做的就是:

$loop = new AisisCore_Template_Helpers_Loop();
$loop->loop();
你应该看到帖子列表


然而,帖子似乎没有出现。有什么东西阻止WordPress循环工作吗?

我相信您在范围方面有问题。您需要将$wp_查询传递到类中,或者通过全局获取它。我相信这样做是可行的,但只适用于全局$wp_查询:

未经测试,但我认为以下内容应该与全局$wp_查询一起使用,或者通过传入其他查询结果集来使用

protected $wp_query;

public function __construct($wp_query = null, $options = null){
    if (empty($wp_query)) global $wp_query;
    if (empty($wp_query)) return false; // or error handling

    $this->wp_query = $wp_query;

    if(isset($options)){
        $this->_options = $options; 
    }
}

public function loop(){
    global $wp_query;
    if($this->wp_query->have_posts()){
        while($this->wp_query->have_posts()){
            $this->wp_query->the_post();
            the_content();
        }
    }
}

我祈祷这一点,但我认为它应该有效。但是没有承诺。

正确、清晰的回答:

<?php

class AisisCore_Template_Helpers_Loop{

    protected $_options;

    protected $_wp_query;

    public function __construct($options = null){
        global $wp_query;

        if(isset($options)){
            $this->_options = $options; 
        }

        if(null === $this->_wp_query){
            $this->_wp_query = $wp_query;
        }
    }

    public function init(){}

    public function loop(){
        if($this->_wp_query->have_posts()){
            while($this->_wp_query->have_posts()){
                $this->_wp_query->the_post();
                the_content();
            }
        }
    }
}

如果将wp_查询声明为全局类级别变量,我可以解决一个问题。也就是说,将一个全局变量分配给一个class leve变量,那么在函数循环中就不需要全局$wp_查询。另外:回显$loop->loop也可以工作。$wp\u查询已经是全局的。放置var_dump$GLOBALS['wp_query'];几乎在任何WordPress页面的顶部。有时仍然需要使用全局$wp_查询或通过$GLOBALS数组来访问它。我想说的是,如果您已经在构造函数中实例化它并将其设置为类级变量,则不需要在方法中进行全局定义。我明白了。不,你不应该,在第二个版本中不应该。我应该把它去掉的。不,实际上你没有。看看你的循环{}和我的相比。你的构造器也是一团糟。我实际上发布了两种可能的解决方案。也许这就是你不跟随的原因。我的构造器会做你的构造器不会做的事情。我在回答中解释了这一点。这可不是什么乱七八糟的事。事实上,你在这里发布的内容的重要部分——让它工作的部分——来自我的回答。你将我的代码片段粘贴到你显然已损坏的代码中,并声称这是一个答案,删除了我无意中留下的一个。我不打算继续这样做了,但要玩得开心。很高兴我能帮忙。
<?php

class AisisCore_Template_Helpers_Loop{

    protected $_options;

    protected $_wp_query;

    public function __construct($options = null){
        global $wp_query;

        if(isset($options)){
            $this->_options = $options; 
        }

        if(null === $this->_wp_query){
            $this->_wp_query = $wp_query;
        }
    }

    public function init(){}

    public function loop(){
        if($this->_wp_query->have_posts()){
            while($this->_wp_query->have_posts()){
                $this->_wp_query->the_post();
                the_content();
            }
        }
    }
}