向固定链接添加自定义查询变量

时间:2016-02-28 作者:Mehar

我正在创建一个wordpress插件,其中添加了一些自定义查询字符串和URL,以实现所需的功能。我需要像wordress设置中的post name这样的永久链接。我如何才能做到这一点?我已经使用了wordpress的一些内置功能,但这对我来说并不适用。

我想显示此url

http://example.com/?p=6&t=123
像这样

http://example.com/page6/t/123
有什么建议吗?

1 个回复
SO网友:jgraup

使用add_rewrite_rule 捕获url并在内部转换为参数。

http://example.com/page{p}/t/{t}

to 

http://example.com/?p={p}&t={t}
添加到您的函数中。php或插件。

<?php

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

    class SimpleRewrite {
        const ENDPOINT_QUERY_NAME  = \'page\';
        const ENDPOINT_QUERY_PARAM = \'__rewrite_page\';

        // 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 ) {

            // add all the things we know we\'ll use

            $vars[] = static::ENDPOINT_QUERY_PARAM;
            $vars[] = \'p\';
            $vars[] = \'t\';

            return $vars;
        }

        // Add API Endpoint

        public function add_endpoint() {
            add_rewrite_rule( \'^\' . static::ENDPOINT_QUERY_NAME . \'([^/]*)/t/([^/]*)/?\', \'index.php?\' . static::ENDPOINT_QUERY_PARAM . \'=1&p=$matches[1]&t=$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[ static::ENDPOINT_QUERY_PARAM ],
                $wp->query_vars[ \'p\' ],
                $wp->query_vars[ \'t\' ] ) ) {
                $this->handle_request(); // handle it
            }
        }

        // Handle Requests

        protected function handle_request() {
            global $wp;

            $page = $wp->query_vars[ \'p\' ];
            $t    = $wp->query_vars[ \'t\' ];

            add_filter( \'template_include\', function( $original_template ) {
                return __DIR__ . \'/custom.php\';
            } );
        }
    }

    $wpSimpleRewrite = new SimpleRewrite();
    $wpSimpleRewrite->init();

endif; // SimpleRewrite
将参数限制为仅数字“\\d“将重写匹配更改为:

\'^\' . static::ENDPOINT_QUERY_NAME . \'(\\d*)/t/(\\d*)/?\'

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?