web-dev-qa-db-ja.com

カスタム投稿タイプアーカイブをメタ値でフィルタリングする方法

クライアント用のカレンダープラグインを作成しようとしているところに問題があります。使用しているカスタム投稿タイプの日付ベースのアーカイブを取得できません。私はパーマリンクを扱うためのワードプレスシステムがどのように低レベルで設定されているかについてあまり精通していません、そして私は壁にぶつかりました。

背景:

プラグインはカスタム投稿タイプeventを登録します。各イベントはkultkal_dateと呼ばれるメタ値フィールドを持ち、2011-09-28の形式で日付を保持します。 (save_postアクションの検証により、イベントは各イベントの日付も一意であるという意味で制限されています)。

投稿タイプのカスタムパーマリンクを/kalendarie/%kultkal_year%/%kultkal_month%/%kultkal_day%として定義したので、完成したURLは/kalendarie/2011/09/28/my-slugのようになります。以下のようにinitアクションを使ってカスタムパーマリンクの書き換えタグを追加しました:

add_rewrite_tag('%kultkal_year%','([0-9]{4})');
add_rewrite_tag('%kultkal_month%','([0-9]{2})');
add_rewrite_tag('%kultkal_day%','([0-9]{2})');

私はpost_type_linkフィルタで実行されるパーマリンクを修正するための関数を持っています。

function filter_post_type_link($link, $post){
    if ($post->post_type != 'event')
        return $link;

    if ($date = get_post_meta($post->ID, 'kultkal_date', true)) {
        $dates = explode('-', $date);
        $year = $dates[0];
        $month = $dates[1];
        $day = $dates[2];
    } else {
        return $link;
    }
    $link = str_replace('%kultkal_year%', $year, $link);
    $link = str_replace('%kultkal_month%', $month, $link);
    $link = str_replace('%kultkal_day%', $day, $link);
    return $link;
}

個々の投稿を表示するとうまくいきます。アーカイブページも同様です(投稿タイプを登録すると、/kalendarium/ URL:has_archivekalendariumに設定されます)。

年によって投稿をフィルタリングしたいときに問題が始まります - 例えば/kalendarium/2011//kalendarium/2011/09/28/など。組み込み投稿の日付のメタ値に基づいてフィルタリングする方法についての答えがここにあります: アーカイブカスタムフィールド/投稿メタの日付値でフィルタされたリスト? - ただし、カスタム投稿タイプでは機能しないようです。それをテストするために/ year/month/day-parametersを追加するとすぐに、404でもなく、組み込みの投稿タイプのアーカイブを取得します(これまでのところ、私は上記の答えの最初のバージョンを試しただけです)。すべての組み合わせ(年/月/日)を持つものではなく、posts_whereのフックなど.

これが私がpre_get_posts上で実行する(壊れた)関数がどのようなものかを示しています:

function event_pre_get_posts($query) {
    global $wp_the_query;
    if ($query === $wp_the_query && $query->is_archive()) {
        $qv = &$query->query_vars;
        if (isset($qv['kultkal_year']) && isset($qv['kultkal_month']) && isset($qv['kultkal_day'])) {
            $date = mktime(0,0,0,$qv['kultkal_month'],$qv['kultkal_day'],$qv['kultkal_year']);
            $qv['meta_key'] = 'kultkal_date';
            $qv['meta_value'] = date("Y-m-d", $date);
        }
    }
}

探しているソリューションをどのように達成するかについてのアイデアはありますか?

4
Emil Björklund

Bainternetがコメントで言ったように、あなたはadd_query_varadd_rewrite_ruleを台無しにする必要があるでしょう。

通常は次のようなことをします。

global $wp;
$wp->add_query_var( 'some_var' );
add_rewrite_rule( 'some/path/([^/]+)/?$', 'index.php?some_var=$matches[1]' );

これを参照してください Wordpress Tracチケット 、およびadd_query_varおよび add_rewrite_rule

1
Tyler Carter