使用自定义重写规则和自定义TEMPLATE_REDIRECT预先填充$wp_Query设置

时间:2013-06-01 作者:Roman

我目前正在开发一个文件浏览器插件,它需要注册用户的前端编辑功能。对于这个场景,我已经为我的自定义帖子类型注册了一些自定义重写规则。

重写分析器

Rewrite Analyzer Window

正如您在上面的屏幕截图中所看到的,该插件有一个用于管理下载的基本CRUD界面。路由是通过template_redirect 钩子,用于检查查询变量action 设置,然后调用相应的操作方法。

add_action(\'template_redirect\', array($this, \'_requestHandler\'), 9);
// ...
public function _requestHandler() {
    try {
        $requestedPage = get_query_var(\'pagename\');

        if((isset($requestedPage) && $requestedPage == \'webeo-download\')) {
            $action = get_query_var(\'action\');
            $this->action = (isset($action)) ? $action : null;

            $downloadId = get_query_var(\'download\');
            $this->downloadId = (isset($downloadId)) ? (int) $downloadId : null;

            if(isset($this->action) && !is_null($this->action) && strlen($this->action) > 0) {
                $method = \'action\' . ucfirst($this->action);

                if(method_exists($this, $method)) {
                    call_user_func(array($this, $method));
                } else {
                    throw new Webeo_Exception(sprintf(__(\'Action method <code>%s</code> does not exists.\', WEBEO_DOWNLOAD_TEXTDOMAIN), $method));
                }
            } else {
                $this->actionIndex();
            }

            echo $this->view->render($this->view->viewTemplate);
            exit();
        }
    } catch (Webeo_Exception $e) {
        $this->view->assign(\'error\', $e);
        echo $this->view->render(\'default.phtml\');
        exit();
    }
}
除了一件事之外,这真的很有效。我想阻止WordPress为我的自定义帖子类型生成任何默认重写规则。从外部访问我的帖子也应该受到限制。只有我上面的控制器负责向用户提供任何下载数据。

为此,我设置了参数publicpublicly_queryable 在内部为falseregister_post_type 作用我也设定了论点exclude_from_searchtrue.

这似乎奏效了。默认重写规则下未显示帖子(例如。example.com/downloads/<postname>) 默认搜索结果中也没有列出下载。不幸的是$wp_query 参数也不再设置。因此我无法使用comments_template() 或模板中的任何其他循环函数。

很明显:WordPress不知道我的页面结构,无法生成正确的设置。我尝试手动预填充$wp_query 中重定向之前的参数template_redirect 方法但这似乎不起作用。我可能要迟到了。

global $wp_query, $post, $withcomments;
$wp_query->is_single = true;
$wp_query->is_page = true;
$post = get_post($this->downloadId);
$withcomments = true;
wp_reset_query();
有什么建议吗?

提前谢谢阿曼

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

我可能已经找到了上述问题的解决方案。预填充全局变量$wp_query 您必须运行query_posts() 函数,并重置$wp_query->post 使用函数wp_reset_postdata(). 必须在template_redirect 挂钩或更早。

class Webeo_Download {
    protected $downloadId;
    protected $action;

    public function setup() {
        // ...
        add_action(\'template_redirect\', array($this, \'_requestHandler\'), 9);
    }

    public function _requestHandler() {
        $this->action = get_query_var(\'action\');
        $this->downloadId = get_query_var(\'download\');

        // ... load appropirate action method based on the query variable "action". See code example in the question above. 
    }

    public function actionView() {
        // Check permissions
        if(!is_user_logged_in()) {
            wp_redirect(wp_login_url());
            exit;
        }

        // Populate $wp_query for single download view
        global $wp_query;
        $args = array(\'post_type\' => \'download\', \'p\' => $this->downloadId);
        query_posts($args);
        wp_reset_postdata();

        // Load the template
    }

    public function actionIndex() {
        // Do the same for all other action methods
    }

    public function actionAdd() {
        // ...
    }

    public function actionEdit() {
        // ...
    }

    public function actionDelete() {
        // ...
    }

    public function actionDownload() {
        // ...
    }
}
如果有人有更好的方法,请让我知道!

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post