Putting the WordPress Loop into a class

2019-09-25 04:00发布

I am trying to build a framework essentially for WordPress Developers to help develop Themes and Theme Frameworks more efficiently and faster.

How ever, I am having a small issue by putting the wordpress loop into a class, this is what I have:

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();
            }
        }
    }
}

Keep in mind the simplicity of the class for now. All you have to do is:

$loop = new AisisCore_Template_Helpers_Loop();
$loop->loop();

And you should see the list of posts.

How ever, it appears that posts do not appear. Is there something preventing the WordPress loop from working?

2条回答
聊天终结者
2楼-- · 2019-09-25 04:37

I believe you have problem with "scope". You will need to pass $wp_query into the class or grab it via global. I believe that just this would work but only for the global $wp_query:

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

Untested but I think the following should work either with the global $wp_query or by passing in some other query result set.

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();
        }
    }
}

Fingers crossed on that one but I think it should work. No promises though.

查看更多
狗以群分
3楼-- · 2019-09-25 04:50

The proper, clean answer:

<?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();
            }
        }
    }
}
查看更多
登录 后发表回答