ADD_REWRITE_RULE()快把我逼疯了,重写不能在分析器说它应该工作的时候工作

时间:2015-12-16 作者:Christin Milloy

我有一个特殊的情况,需要一些帮助来完成最后一步。

Background:

当我访问mydomain时。com/category/postname,我如期得到了这篇文章。

当我访问mydomain时。com/category/postname?ajax=1,我得到了post-html(烘焙到并包括其相应的页面模板标记,这对于这个用例非常重要),但我得到了它的呈现without 它的页眉和页脚(我是故意这样做的,在header.php和footer.php文件中使用$\\u GET[\'ajax]==1条件来抑制它们)。

This all works as expected. 然而,这给我留下了一个新的小问题。。。浏览器无法正确缓存以GET参数字符串结尾的URL中的内容。

Therefore, 我想创建一个重写规则,以实现以下目标。。。

mydomain。com/ajax/category/postnamebecomesmydomain。com/category/postname?ajax=1

Here\'s from my functions.php:

function dynaload_rewrite() {
  add_rewrite_rule(\'ajax/(.*)/?\', \'$matches[1]?ajax=1\', \'bottom\');
}
add_action(\'init\', \'dynaload_rewrite\');

This results in .htaccess file as follows:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteRule ^ajax/(.*)/? /$matches[1]?ajax=1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Expected Result: 当我访问ajax/category/postname时,我希望呈现来自/category/postname的内容,减去页眉和页脚,就像我正常使用访问时一样?ajax=1

Actual Result: 我收到了WordPress 404页面的内容,但是页眉和页脚are 省略(因此我知道参数ajax=1传递正确,只是加载了错误的页面)。

感谢您的成功帮助,并将被视为令人印象深刻。非常感谢。

2 个回复
SO网友:Milo

您的外部规则不起作用,因为您使用的格式仅适用于内部规则-$matches[1] 从本质上讲,这是胡说八道。htaccess文件。使用$matches 数组只有在规则由PHP解析时才起作用,外部规则需要使用标准$1 而不是$matches[1]. 任何不指向index.php 被解释为外部规则并添加到。htaccess而不是内部规则数组。

也就是说,我建议稍微改变一下adding a rewrite endpoint 而不是规则。您的URL将是:

http://example.com/category/postname/ajax/

然后你可以检查一下get_query_var(\'ajax\') 在模板中设置。

SO网友:jgraup

这可以捕获类别和post\\u名称,然后更改呈现的模板。

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

    class WPTestPluginEndpoint
    {
        const ENDPOINT_QUERY_NAME = \'ajax\';

        // 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[] = \'ajax\';
            $vars[] = \'cat\';
            $vars[] = \'post_name\';

            return $vars;
        }

        // Add API Endpoint

        public function add_endpoint()
        {
            add_rewrite_rule(\'^ajax/([^/]*)/([^/]*)/?\', \'index.php?ajax=1&cat=$matches[1]&post_name=$matches[2]\', \'top\');

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

        // Sniff Requests

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

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

                $_REQUEST [\'ajax\'] = $wp->query_vars[\'ajax\'];
                $_REQUEST [\'cat\'] = $wp->query_vars[\'cat\'];
                $_REQUEST [\'post_name\'] = $wp->query_vars[\'post_name\'];

                $this->handle_request(); // handle it
            }
        }

        // Handle Requests

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

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

                $args = array(
                    \'cat\' => $_REQUEST[\'cat\'],
                    \'post_name\' => $_REQUEST[\'post_name\'],
                );

                //var_dump($original_template);

                return get_template_directory() . \'/single.php\';
            });
        }
    }

    $wptept = new WPTestPluginEndpoint();
    $wptept->init();

endif; // WPTestPluginEndpoint
在模板中

if ( ! isset( $_REQUEST[\'ajax\'] ) ) get_header(); ?>

<?php if ( ! isset( $_REQUEST[\'ajax\'] ) ) get_footer(); ?>

相关推荐