次のフォーマットでカスタムテンプレートにパラメータを渡しています
www.example.com/?pageid=12&rid=24&title=this-is-the-title
テーブルを2つ作成しました。だから私はデータを取得し、それらのページに表示する必要があります。
私はそれがきれいなURLフォーマットを使用していることを望みます:
www.example.com/pageid/12/rid/24/title/this-is-the-title
これを達成する方法を誰かが教えてもらえますか?
ありがとう
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
でその投稿IDを探すようにクエリを修正するだけです。 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>";
}
あなたが単純な解決策を望むならば、これはそれであるかもしれません(それが機能しないならそれほど単純ではないかもしれないのでコードをテストしていないかもしれません...)。あなたが http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/を訪問するなら /あなたはボーナス賞を見つけるでしょう:記事の中でRewrite Rule Generator。私は以前にこれを使ったことがありますが、このような状況ではありません。その機能を次のようなものと組み合わせてみてください。
add_rewrite_tag('%pageid%','([^&]+)');
add_rewrite_tag('%rid%','([^&]+)');
add_rewrite_tag('%title%','([^&]+)');
/* Generate rewrite rules. */
add_action( 'generate_rewrite_rules', 'example_add_rewrite_rules' );
function example_add_rewrite_rules() {
global $wp_rewrite;
$new_rules = eg_generate_rewrite_rules( 'post' , array('pageid','rid','title')); // post = the post type you use
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
/* Flush rewrite rules on theme activation only. */
add_action( 'load-themes.php', 'frosty_flush_rewrite_rules' );
function frosty_flush_rewrite_rules() {
global $pagenow;
if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )
flush_rewrite_rules();
}
Eg_generate_rewrite_rules関数を使いたくない場合は、自分でルールを設定する必要があります。その記事でその方法を説明しています。
より多くの情報: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag