クライアント用のカレンダープラグインを作成しようとしているところに問題があります。使用しているカスタム投稿タイプの日付ベースのアーカイブを取得できません。私はパーマリンクを扱うためのワードプレスシステムがどのように低レベルで設定されているかについてあまり精通していません、そして私は壁にぶつかりました。
背景:
プラグインはカスタム投稿タイプ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_archive
はkalendarium
に設定されます)。
年によって投稿をフィルタリングしたいときに問題が始まります - 例えば/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);
}
}
}
探しているソリューションをどのように達成するかについてのアイデアはありますか?
Bainternetがコメントで言ったように、あなたはadd_query_var
とadd_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