1

「my_type」という名前のカスタム投稿タイプがある場合、Wordpress で日付ベースのアーカイブを作成するにはどうすればよいですか。たとえば、次のようになります。

mysite.com/my_type/2010/
mysite.com/my_type/2010/07/
mysite.com/my_type/2010/07/28/

書き換えルールの作成と、URL をテンプレートにリンクするためのヒントを探しています。

ありがとう!


更新: functions.php で次のことを試しました (EVENT_TYPE_SLUG は別の場所で定義された定数です):

function event_rewrite_rules() {
    global $wp_rewrite;
    $new_rules = array(
        EVENT_TYPE_SLUG."/([0-9]{4})/([0-9]{1,2})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1).'&monthnum='.$wp_rewrite->preg_index(2),
        EVENT_TYPE_SLUG."/([0-9]{4})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1),
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'event_rewrite_rules');

書き換えルールは $wp_rewrite-> rules に表示されますが、それらのページに移動すると 404 エラーが発生します。に手動で移動するとmysite.com/index.php?post_type=event&year=2010、リダイレクトされますmysite.com/2010?post_type=event

4

3 に答える 3

0

OK ...少し時間がかかりましたが、私はこれを理解しました(もっとエレガントな解決策があるかもしれません)。

1)アーカイブページとして機能する(そしてテンプレートへのアクセスを許可する)標準のワードプレスページを作成します。ページのスラッグを定数(EVENT_ARCHIVE_BASE)として定義したので、1つの場所にハードコーディングされ、他の場所で参照されます。

2)そのページのURLをキャッチし、それらをページにリダイレクトするカスタム書き換えルールを作成します。

function event_date_queryvars($qvars) {
    array_push($qvars, 'eyear', 'emonth');
    return $qvars;
}
add_filter('query_vars', 'event_date_queryvars');

function event_date_rewrite_rules() {
    // Adds rewrite rules for date-based event archives
    global $wp_rewrite;
    $new_rules = array(
        EVENT_ARCHIVE_BASE."/([0-9]{4})/([0-9]{1,2})/?$" =>
            "index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1)."&emonth=".$wp_rewrite->preg_index(2),
        EVENT_ARCHIVE_BASE."/([0-9]{4})/?$" => "index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1),
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'event_date_rewrite_rules');

3)ページテンプレートの上部で、カスタムクエリ変数を確認し、それに応じてページを作成します。(組み込みのyearとmonthnumを使用できたはずですが、正しく機能させることができませんでした。今後のトラブルシューティング):

// Was the page called with a specific year, month, or just plain?
$year = get_query_var('eyear');
$monthnum = sprintf('%02d', get_query_var('emonth'));
if ($monthnum) {
    $list_type = 'Month';
    $monthname = $month[$monthnum];
    $heading = "Events from $monthname, $year";
} elseif ($year) {
    $list_type = 'Year';
    $heading = "Events from $year";
} else {
    $list_type = 'AllPast';
    $heading = get_the_title();
}

助けてくれてありがとう、そしてこれが他の誰かのために役立つことを願っています!これを行うためのより簡単な/組み込みの方法があるかどうかをお知らせください。

于 2010-06-30T16:57:16.503 に答える
0

よりエレガントな組み込みのソリューションを見つけることができました。

トリックは「post_type=article」パラメーターにあります。次のようにリライトを作成する場合:

'(articles)/([0-9]{4})' => 'index.php?post_type=article&eyear=' . $wp_rewrite->preg_index(2)

これにより、URL 構造が維持されますが、デフォルトの「アーカイブ」テンプレートが使用されます。次に、テンプレートをデフォルトから独自のアーカイブ テンプレートに盗みます。(例えば、'archive-articles.php')

この関数はこれを実現します(私にとってはうまくいきます):

add_action("template_redirect", 'my_template_redirect');

// Template selection
function my_template_redirect()
{
    global $wp;
    global $wp_query;
    if ($wp->query_vars["post_type"] == "article")
    {
        if (have_posts())
        {
            include(TEMPLATEPATH . '/archive-articles.php');
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }
    }
}

年/月/日の get_query_var() を処理する独自のメソッドを作成する必要がありますが、少なくともカスタム ページ テンプレートを作成する必要はありません。

于 2011-09-01T07:21:37.823 に答える
0

Benj WordPress はカスタム投稿タイプのアーカイブを自動的に作成すると思います

于 2010-06-29T10:54:27.100 に答える