web-dev-qa-db-ja.com

ページ付きURLとして機能するようにCPTシングル投稿URLの書き換えルールをカスタマイズする

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 StudiesPosts 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の構造、あるいはその両方ですか?

どうぞよろしくお願いします。

2
dashaluna

わかりました、それで私はそれが多かれ少なかれ正しく働くようになりました、小さな問題がまだ残っているけれども、読んでください..

これが私が持っているものです:

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が正しく機能しています。

  • サービス/コピーライティング/
  • サービス/コピーライティング/ページ/ 2

ただし、「存在しないページ」のURLは404テンプレートにリダイレクトされませんが、明らかに空のコンテンツを含むarchiveテンプレートが表示されます。では、そのような「存在しない」ページURLが404テンプレートに正しくリダイレ​​クトされるようにするにはどうすればよいでしょうか。例えば、2ページ分のデータしかない場合のservices/copywriting/page/3 URL。

EDIT

また、 'services/bla-bla'のように存在しないサービスが参照されると、404テンプレートではなくarchiveテンプレートも表示されることにも気付きました。

私は完全に気が狂うようになる前に、私は非常にどんなヒントでも感謝するでしょう。ありがとう。

1
dashaluna

私が問題を理解している限り、あなたはあなたの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' => '&nbsp;', 'next_or_number' => 'number')); </div>

これで、このCPTは<!--nextpage-->をサポートし、それに応じてあなたのURLが生成されます。

また この議論は役に立つかもしれません 。覚えておいてください - あなたは同じ名前のCPTとPageを持つことはできません。

0
ommunist