add_rewrite_rule()
cho phép bạn biến url đẹp thành biến.
- số:
(\d*)
- phần:
/rid/
hoặc/pageid/
- sên
([a-zA-Z0-9-]+
Dưới đây là một lớp để đăng ký viết lại và xử lý yêu cầu nếu một trận đấu đã được tìm thấy.
<?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
CẬP NHẬT
Tôi tìm thấy một cách đơn giản hơn để xử lý này.
http://example.com/pageid/333/rid/444/title/your-title-here/
Phương pháp mới này sử dụng add_rewrite_tag
với _
để chạy các truy vấn cho ID của trang web mà không rối tung lên truy vấn chính. Trong ví dụ trên, 333
sẽ chỉ sửa đổi truy vấn để tìm ID bài đăng đó pre_get_posts
. Bạn có thể dễ dàng sửa đổi template_redirect
hoặc 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' );
Để tham khảo tất cả các thông số được thông qua sau:
/**
* 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>";
}
TÀI LIỆU THAM KHẢO