web-dev-qa-db-ja.com

パーマリンクをサポートしているカテゴリー別アーカイブ/ category/YYYY

現在、WordPress内で、ユーザーがデフォルトのカテゴリOR yearではなくカテゴリと年でフィルタできる新しいタイプのサイトアーカイブの作成を検討しています。

私はインターフェースを作成するサイドバーウィジェットを作成することを望んでいますが、カスタムパーマリンク設定の作成に関するアイデアやアドバイスを探しています。理想的には、アーカイブは以下の行に沿ったURLで動作します。

/ category/year /

/ category-1 /年/

等.

私は年よりも深いものをフィルタリングする必要はありません。私は このコードの断片を発見しました しかしそれは期待通りには動作しません。

ありがとう

5
Scott

@StephenHarrisの提案に従って、私はもう少しコードを開発し、次のことを思いつきました。

add_action('generate_rewrite_rules', 'my_rewrite_rules');
function my_rewrite_rules( $wp_rewrite ) {

    // handles paged/pagination requests
    $new_rules = array('news/(.+)/year/(.+)/page/?([2-9][0-9]*)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(3));

    // handles standard requests
    $new_rules1 = array('news/(.+)/year/(.+)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2));

    // Add the new rewrite rule into the top of the global rules array
    $wp_rewrite->rules = $new_rules + $new_rules1 + $wp_rewrite->rules;
}

これにより、サイトは次のようなURLをサポートできます。

/ニュース/私のカテゴリ/年/ 2011 /ページ/ 2

と同様

/ニュース/私のカテゴリー/年/ 2011

私のサイトのポスト/ブログ部分には "news"というプレフィックスが付いているので、正規表現の最初の部分を微調整して "news"という単語を削除してください。

あなたがそれを使うつもりならば、あなたがパーマリンク設定ページを訪問することによってあなたの書き換えルールをフラッシュすることを確認してください。

2
Scott

あなたが探しているのは エンドポイント です。これらのいくつかはすでに組み込まれています。フィードの場合は/feed/some-feed/、投稿の場合は/trackback/です。どちらもエンドポイントです。

幸いなことに、WordPressには便利な機能があり、あなた自身のendpionを簡単に追加できます。 add_rewrite_endpoint

これはあなたの年間カテゴリアーカイブを機能させるために必要なすべてのコードです:

<?php
add_action( 'init', 'wpse31422_init' );
function wpse31422_init()
{
    add_rewrite_endpoint( 'year', EP_CATEGORIES );
}

プラグインとして: https://Gist.github.com/1296860

これはStephen Harrisの回答とまったく同じように機能します。yoursite.com/category/some-cat-slug/year/2011/にアクセスすると、年間のカテゴリアーカイブにアクセスできます。

エンドポイントを追加すると、add_rewrite_endpoint関数の最初の引数と同じ名前のクエリ変数が作成されます。この場合はyearです。このクエリvarはWPにすでに存在しているため(データベースアーカイブを処理するため)、ここで特別なことをする必要はありません。

6
chrisguitarguy

これはテストされていませんが、試してみてください(コードを追加した後は、settings> Permalinksの順に選択し、[save]をクリックして有効にする必要があります)。

add_action('generate_rewrite_rules', 'my_rewrite_rules');
function my_rewrite_rules( $wp_rewrite ) {
  $new_rules = array(
     '(.+)/year/(.+)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2),
       );

  // Add the new rewrite rule into the top of the global rules array
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

http://yourwebsite.com/foobar/year/2011 そして2011年にカテゴリーfoobarに結果を返す。

構造がそれを実現するための最良の方法であるかどうかはわかりません。望ましくない問題を避けるために、私は次のものを使うことをお勧めします: http://yourwebsite.com/category/foobar/year/2011 そして代わりに:

'category/(.+)/year/(.+)' => '?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2)

お役に立てれば!

2
Stephen Harris

私は、StephenHarrisとScottによるソリューションを少し修正して使用することで、うまく機能させることができました。

function add_events_by_year_rewrite_rules($wp_rewrite){
    // handles paged/pagination requests
    $new_rules_with_pagination = array('c/(.+)/year/(.+)/page/?([2-9][0-9]*)' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(3));

    // handles standard requests
    $new_rules_without_pagination = array('c/(.+)/year/(.+)' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&year='.$wp_rewrite->preg_index(2));

    // Add the new rewrite rule into the top of the global rules array
    $wp_rewrite->rules = $new_rules_with_pagination + $new_rules_without_pagination + $wp_rewrite->rules;

    return $wp_rewrite->rules;
}

add_filter('generate_rewrite_rules', 'add_events_by_year_rewrite_rules');

書き換えルールの定義に追加されたindex.phpに注目してください。

0
vlatkorun