动态URL,而不是数据库中的物理页面

时间:2015-12-24 作者:dcolumbus

我知道WordPress基本上是如何处理页面请求的(通过index.php和.htaccess),我正试图找出“忽略”某个永久链接结构的最佳方法,或者以允许我使用模板或插件脚本(由我创建)来处理这些独特请求的方式重写它。

我正在做的是创建一个插件来处理RETS房地产数据,但不在WordPress界面内。我的插件在数据库中创建一个新表,并使用外部Cron作业来更新自身。这样,我就可以使用标准$wpdb 函数,但我不受wp_postswp_postmeta 表格。。。因为我担心这会引起太多的肿胀。

我想在以下位置展示我自己的页面:

http://www.mywebsite.com/properties - 这是谷歌地图http://www.mywebsite.com/properties/home-for-sale-in-{萨克拉门托}/{123456}

在上面的场景中,将使用parse_url 然后用于查询数据库中相应的属性。

显然,我需要WP忽略/properties* 或利用Rewrite API, 我宁愿这样做。。。

在这方面我能得到一些帮助吗?如果需要,我很乐意发布更多信息。

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

add_rewrite_rule 可以帮助您嗅探请求,并让您根据需要进行处理。

if( ! class_exists(\'PropertiesEndpoint\')):

    class PropertiesEndpoint { 

        // WordPress hooks

        public function init() {
            add_filter(\'query_vars\', array($this, \'add_query_vars\'), 0);
            add_action(\'parse_request\', array($this, \'sniff_requests\'), 0);
            add_action(\'init\', array($this, \'add_endpoint\'), 0);
        }

        // Add public query vars

        public function add_query_vars($vars) {
            $vars[] = \'__properties\';
            $vars[] = \'city\';
            $vars[] = \'id\';

            return $vars;
        }

        // Add API Endpoint

        public function add_endpoint() {
            add_rewrite_rule(\'^properties/([^/]*)/([^/]*)/?\', \'index.php?__properties=1&city=$matches[1]&id=$matches[2]\', \'top\');
            add_rewrite_rule(\'^properties/?\', \'index.php?__properties=1\', \'top\');

            flush_rewrite_rules(false); //// <---------- REMOVE THIS WHEN DONE
        }

        // Sniff Requests

        public function sniff_requests($wp_query) {
            global $wp;

            if(isset($wp->query_vars[ \'__properties\' ])) {

                if(isset($wp->query_vars[ \'city\' ]) && isset($wp->query_vars[ \'id\' ])) {
                    $this->handle_request__properties_home_for_sale();
                    die(); // stop default WP behavior
                }
                else if( isset($wp->query_vars[ \'city\' ]) ) {

                    // handle in separate file
                    require_once get_template_directory() . \'/single-properties-in-city.php\'; 
                    die(); // stop default WP behavior
                }

                $this->handle_request__properties();  
                // continue default WP behavior
            }
        }

        // Handle Requests

        protected function handle_request__properties_home_for_sale() {
            global $wp;

            $city = $wp->query_vars[ \'city\' ];
            $id = $wp->query_vars[ \'id\' ];

            ?>SHOW PROPERTY IN <?php echo $city . \' - \' . $id;
        }

        protected function handle_request__properties() {
            // Control the template used

            add_filter(\'template_include\', function ($original_template) {

                // change the default template to a google map template
                return get_template_directory() . \'/single-properties-google-map.php\';
            });
        }

    }

    $propEPT = new PropertiesEndpoint();
    $propEPT->init();

endif; // PropertiesEndpoint
Monkeyman Rewrite Analyzer 可以帮助您确保端点正常工作。

<人力资源>

UPDATE

我添加了几种处理请求的方法。您可以通过使用终止进程来忽略默认WP行为die() 在你处理完之后。或调整模板并继续默认行为template_include 滤器