add_rewrite_rule()
允许您将漂亮的url转换为变量。
编号:(\\d*)
部分:/rid/
或/pageid/
段塞:([a-zA-Z0-9-]+
这里有一个类,用于注册重写并在找到匹配项时处理请求。
<?php
if ( ! class_exists( \'CPTURLRewrite\' ) ):
class CPTURLRewrite {
const ENDPOINT_QUERY_NAME = \'pageid\';
const ENDPOINT_QUERY_PARAM = \'__pageid\';
// 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[] = \'pageid\';
$vars[] = \'rid\';
$vars[] = \'title\';
return $vars;
}
// Add API Endpoint
public function add_endpoint() {
// numbers: (\\d*)
// section: /rid/
// slug: ([a-zA-Z0-9-]+
add_rewrite_rule( \'^\' . static::ENDPOINT_QUERY_NAME . \'/(\\d*)/rid/(\\d*)/title/([a-zA-Z0-9-]+)?\', \'index.php?\' . static::ENDPOINT_QUERY_PARAM . \'=1&pageid=$matches[1]&rid=$matches[2]&title=$matches[3]\', \'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[ \'pageid\' ],
$wp->query_vars[ \'rid\' ],
$wp->query_vars[ \'title\' ] ) ) {
$this->handle_request(); // handle it
}
}
// Handle Requests
protected function handle_request() {
global $wp;
// (optional) act on the query vars
$pageid = $wp->query_vars[ \'pageid\' ];
$rid = $wp->query_vars[ \'rid\' ];
$title = $wp->query_vars[ \'title\' ];
// (optional) select your custom template
add_filter( \'template_include\', function( $original_template ) {
return __DIR__ . \'/custom.php\';
} );
}
}
$wpCPTURLRewrite = new CPTURLRewrite();
$wpCPTURLRewrite->init();
endif; // CPTURLRewrite
更新我找到了一种更简单的方法来处理这个问题。
http://example.com/pageid/333/rid/444/title/your-title-here/
这种新方法利用
add_rewrite_tag
具有
_
在不破坏主查询的情况下运行页面ID查询。在上述示例中,
333
只需修改查询以在
pre_get_posts
. 您可以轻松地修改
template_redirect
或
template_include
.
/**
* Register a rewrite endpoint for the API.
*/
function prefix__init() {
// add tags with `_` prefix to avoid screwing up query
add_rewrite_tag( \'%_pageid%\', \'(\\d*)\' );
add_rewrite_tag( \'%_rid%\', \'(\\d*)\' );
add_rewrite_tag( \'%_title%\', \'([a-zA-Z\\d\\-_+]+)\' );
// create URL rewrite
add_rewrite_rule( \'^pageid/(\\d*)/rid/(\\d*)/title/([a-zA-Z\\d\\-_+]+)?\', \'index.php?_pageid=$matches[1]&_rid=$matches[2]&_title=$matches[3]\', \'top\' );
// required once after rules added/changed
// flush_rewrite_rules( true );
}
add_action( \'init\', \'prefix__init\' );
/**
* Handle data (maybe) passed to the API endpoint.
*
* @param $query
*/
function prefix__pre_get_posts( $query ) {
if ( isset( $query->query_vars[ \'_pageid\' ], $query->query_vars[ \'_rid\' ], $query->query_vars[ \'_title\' ] ) ) {
// set the query to search for a page using `_pageid`
$query->set( \'p\', $query->query_vars[ \'_pageid\' ] );
}
}
add_action( \'pre_get_posts\', \'prefix__pre_get_posts\' );
要引用稍后传递的所有参数,请执行以下操作:
/**
* Debug the query params at any point
*/
function prefix__show_query_args() {
global $wp_query;
echo "<pre>";
print_r( array (
\'pageid\' => $wp_query->query_vars[ \'_pageid\' ],
\'rid\' => $wp_query->query_vars[ \'_rid\' ],
\'title\' => $wp_query->query_vars[ \'_title\' ],
\'file\' => __FILE__,
\'line\' => __LINE__,
) );
echo "</pre>";
}
参考
https://10up.github.io/Engineering-Best-Practices/php/#performance