Service
というCPTが次のように登録されています。
$args = array(
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'has_archive' => false,
'rewrite' => array('slug' => 'services', 'with_front' => false),
'query_var' => true,
'capability_type' => 'post',
'hierarchical' => false,
'show_in_nav_menus' => false,
'menu_position' => 20,
'supports' => array(
'title'
'editor',
'thumbnail',
'author',
'revisions'
)
);
register_post_type('service', $args);
"Services"というページに、カスタムテンプレートが割り当てられており、すべてのサービスがservices/copywriting
タイプのパーマリンクで表示されています( 'copywriting'はサービスの名前です)。ここまでは順調ですね。
Case Study
という別のCPTがあります。さて、Case Studies
は Posts 2 Posts pluginを通してServices
投稿につながっています。
私は次のことをやろうとしています:タイプ/services/copywriting
の単一のService
投稿URLを使用して、そのService
に関連するすべてのCase Studies
を表示すること。
そのために、テンプレートリダイレクトルールを次のように追加しました。そのため、single.php
テンプレートの代わりにarchive.php
テンプレートが表示されます。
add_action("template_redirect", 'template_redirect');
function template_redirect(){
global $wp, $wp_query;
// if Service CPT and it's a single page URL then redirect to archive.php template
if($wp->query_vars["post_type"] == "service" && is_single()){
include(TEMPLATEPATH . '/archive.php');
exit; //thanks to @kaiser's comment
}
}
archive.php
テンプレートには、次のものがあります。
Service
に関連付けられているすべてのCase Studies
を取得するカスタムSQL(ここでは、「copywriting」が現在のサービスであるURL services/copywriting
を調べることによって決定します)。services/copywriting/page/<page_num>
型のページ区切り用のリンクを作成する関数ただし、services/copywriting/page/<page_num>
型のリンクは機能せず、常に単一のService
URLリンクservices/copywriting
にリダイレクトされます。
ルールやフィルタを書き直すために追加できるものや、ページ付きリンクをそのように機能させるためのものはありますか。そのため、services/copywriting/page/2
が機能し、私のカスタムSQLが起動して正しいarchive.php
を表示するCase Studies
テンプレートに誘導されます。
archive.php
ではなく専用のテンプレートが必要ですか?
私は本当にどんな助言にも感謝して助けます!
ありがとう、ダーシャ
編集
Rewrite Analyzerプラグイン をインストールしました。そしてservices/copywriting/page/2
のテストは次のパターンにマッチしました:
services/([^/]+)/page/?([0-9]{1,})/?$
次のように置き換えます。
service: copywriting
paged: 2
私はそれが何を意味するのかわかりません:(
編集2
functions.php
に次のように書き換えルールを追加してみました。
add_action('init', 'my_rewrite_add_rewrites');
function my_rewrite_add_rewrites(){
//rewrite rule for Service single post, make it work as paged
add_rewrite_rule(
'^services/(.+?)/?(page/([0-9]+))?/?$',
'index.php?post_type=service&service=$matches[1]&paged=$matches[3]',
'top'
);
}
書き換え規則をフラッシュしました。しかし、タイプservices/copywriting/page/2
のURLにアクセスすると、常にページビットservices/copywriting/
なしでURLが表示されるだけです。
何が悪いのかわからない。私の正規表現が間違っていますか、それともindex.php
の構造、あるいはその両方ですか?
どうぞよろしくお願いします。
わかりました、それで私はそれが多かれ少なかれ正しく働くようになりました、小さな問題がまだ残っているけれども、読んでください..
これが私が持っているものです:
fucntions.php
内:
書き換え規則
add_action('init', 'my_rewrite_add_rewrites');
function my_rewrite_add_rewrites(){
add_rewrite_rule(
'^services/([^/]+)/?$',
'index.php?post_type=service&order=ASC&orderby=menu_order',
'top'
);
add_rewrite_rule(
'^services/([^/]+)/page/?([0-9]{1,})/?$',
'index.php?post_type=service&paged=$matches[2]&order=ASC&orderby=menu_order',
'top'
);
}
リダイレクトルール
add_action("template_redirect", 'my_template_redirect');
function my_template_redirect(){
global $wp_query;
// if Service CPT URL then redirect to archive.php template
if($wp->query_vars["post_type"] == "service"){
include(TEMPLATEPATH . '/archive.php');
exit;
}
}
だから今、タイプ 'services/copywriting'と 'services/copywriting/page/2'などのURLが機能しています。
しかし、小さな問題が残っています。たとえば、合計2ページのコピーライティングサービスを利用している場合は、次の2つのURLが正しく機能しています。
ただし、「存在しないページ」のURLは404
テンプレートにリダイレクトされませんが、明らかに空のコンテンツを含むarchive
テンプレートが表示されます。では、そのような「存在しない」ページURLが404
テンプレートに正しくリダイレクトされるようにするにはどうすればよいでしょうか。例えば、2ページ分のデータしかない場合のservices/copywriting/page/3
URL。
EDIT
また、 'services/bla-bla'のように存在しないサービスが参照されると、404
テンプレートではなくarchive
テンプレートも表示されることにも気付きました。
私は完全に気が狂うようになる前に、私は非常にどんなヒントでも感謝するでしょう。ありがとう。
私が問題を理解している限り、あなたはあなたのCPTをページングさせたいです。 functions.phpでCPTを正しく宣言した後、関連するsingle-{posttypename}.php
テンプレートの先頭にglobal $page $paged
が宣言されていて、wp_link_pages()関数への参照が含まれていることを確認してください。
例文:
<div class="navigation"><?php wp_link_pages(array('before' => '<strong>Pages:</strong> ', 'after' => ' ', 'next_or_number' => 'number')); </div>
これで、このCPTは<!--nextpage-->
をサポートし、それに応じてあなたのURLが生成されます。
また この議論は役に立つかもしれません 。覚えておいてください - あなたは同じ名前のCPTとPageを持つことはできません。