カスタムフィールド/ポストメタの日付値によってフィルタリングされたアーカイブリスト?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/5800

質問

(モデレーターのメモ: 元のタイトルは「カスタム日付で日付までにアーカイブを使用する」でした))

カスタムフィールドとして投稿に追加の日付を追加しています。これで、公開された日付ではなく、カスタム日付までにアーカイブに投稿を表示したいと考えています。たとえば、本日公開された投稿があります (12月22日) ただし、カスタム日付はに設定されています 1月1日. 。 URLをロードするとき archives/date/2011/01 ブラウザでは、一致するカスタム日付が表示されない投稿が表示されません (明らかに)。

のために生成されたページの動作を変更する方法はありますか archives/date/2011/01 URLカスタム日付で投稿を取得するために?

ありがとう。

役に立ちましたか?

解決

WordPressの多くのことと同様に、あなたが望むことをするいくつかの方法があります。それらの1つを説明します。

を削除します 'year', 'monthnum''day' クエリ変数

WordPressが使用しているクエリにパラメーターを変更できます。 'pre_get_posts' 針。これらのパラメーターは、の書き換えルールによって連想配列としてキャプチャされます。 WP_Query 呼び出されるオブジェクト query_vars 変数 'year', 'monthnum''day'.

いつ $wp_query->query_vars の値があります 'year', 'monthnum''day' WordPressは、投稿のリストをクエリするときにそれらを使用するので、 最初のステップは、クエリアレイからこれらのキー価値ペアを削除することです PHPを使用します unset() 働き (ご了承ください $wp_query WordPressのグローバル変数であり、現在のクエリオブジェクトをインスタンスとして含む WP_Query クラス。)

yoursite_pre_get_posts() 以下の関数によってトリガーされます 'pre_get_posts' フックは、これらの変数をから削除します query_vars 配列ですが、クエリがメインクエリ *である場合にのみ *(つまり、 $query フックに渡されたのは、グローバルに正確に等しい $wp_the_query また $query===$wp_the_query)そして、クエリが次の場合のみ 記録 クエリ。これをテーマに追加する場合 functions.php ファイルアーカイブページが日付だけでなく、すべての投稿を表示するのを見つける (だから私たちはあなたが望むものの途中です...):

add_action('pre_get_posts', 'yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    unset($query->query_vars['year']);
    unset($query->query_vars['monthnum']);
    unset($query->query_vars['day']);
  }
}

カスタムフィールドにクエリ変数を追加します

今は少しトリッキーになります。 v3.0.xでは、WordPressでは、の値を使用してカスタムフィールドをクエリすることのみを可能にします query_var 配列と、これらの基準に関数を適用することもできません。

次の変更 yoursite_pre_get_posts() あなたが日付を保存したと仮定して、あなたのアーカイブクエリが正確な日付と一致するようにします 'YYYY-MM-DD' カスタムフィールドのフォーマット:

add_action('pre_get_posts', 'yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $qv = &$query->query_vars;
    $date = mktime(0,0,0,$qv['monthnum'],$qv['day'],$qv['year']);
    $qv['meta_key'] = 'Custom Date';
    $qv['meta_value'] = date("Y-m-d",$date);
    unset($qv['year']);
    unset($qv['monthnum']);
    unset($qv['day']);
  }
}

そして、これがスクリーンショットでどのように見えるかです:

もちろん、それは本当にあなたが望んでいないことではありません。特定の日だけでなく、1年だけではなく、年と月を照会したいと思います。前にも言ったように、それはそれがトリッキーになる場所です。

使用 'posts_where' SQLを変更するためのフック WHERE

基本的にあなたはフックに深く入り込み、電話をかける必要があります 'posts_where' Hookは、SQLクエリフラグメントでテキスト検出と交換を行っているときに、常に避けようとしています。それにもかかわらず、あなたがそれを必要とし、他に何も機能しないなら、それはあなたのために最後の手段としてそこにあります。

だから yoursite_posts_where() 関数は検索します WHERE WordPressがテキスト用に構築する節 "AND wp_postmeta.meta_value = '2011-01'" そして、それをテキストに置き換えます "AND SUBSTRING(wp_postmeta.meta_value,1,7) = '2011-01'", 、そしてここにコードがあります:

add_action('posts_where','yoursite_posts_where',10,2);
function yoursite_posts_where( $where, $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $meta_value = $query->query_vars['meta_value'];
    $length = strlen($meta_value);
    $find = "AND wp_postmeta.meta_value = '{$meta_value}'";
    $replace = "AND SUBSTR(wp_postmeta.meta_value,1,{$length}) = '{$meta_value}'";
    $where = str_replace($find,$replace,$where);
  }
  return $where;
}

変更 yoursite_pre_get_posts() 複数の月のオプションをサポートするため

もちろん、私たちは私たちを変更する必要があります yoursite_pre_get_posts() 異なる長さのメタ値をサポートする機能: 'YYYY', 'YYYY-MM''YYYY-MM-DD' (PHPの複雑な使用と思われるものの使用に注意してください mktime()date() 関数は、単にこれらのパターンについて心配する必要がないことを避けるためだけです。 'YYYY-M', 'YYYY-MM-D''YYYY-M-D'):

add_action('pre_get_posts','yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $qv = &$query->query_vars;  // Make it less tedious to reference
    if ($qv['monthnum']==0) // Just search on YYYY
      $date = $qv['year'];
    else if ($qv['day']==0) // Search on YYYY-MM
      $date = date('Y-m',mktime(0,0,0,$qv['monthnum'],1,$qv['year']));
    else
      $date = date('Y-m-d',mktime(0,0,0,$qv['monthnum'],$qv['day'],$qv['year']));
    $qv['meta_key'] = 'Custom Date';
    $qv['meta_value'] = $date;
    unset($qv['year']);
    unset($qv['monthnum']);
    unset($qv['day']);
  }
}

そして、それは私たちにあなたが探していたものをほぼ締めくくる以下を与えます:

テーマにカスタム日付を表示するコード

ところで、カスタム日付メタ値をつかむためにテーマで使用したコードは次のとおりです。

<?php if ($custom_date = get_post_meta($post->ID,'Custom Date',true)): ?>
  <h2>Custom Date: <?php echo $custom_date; ?></h2>
<?php endif; ?>

PSユーザーが入る必要があることを忘れないでください 'YYYY-MM-DD' フォーマット

ユーザーはでカスタム日付を入力する必要があることを忘れないでください 'YYYY-MM-DD' これが機能するための形式。もちろん、いくつかの異なる方法、つまりSQLコードまたは 'save_post' 日付を再フォームしますが、私はそれを他の誰かのための演習として残します。

PPSオプション:代わりに複数のメタ値を保存します

別のアプローチは、を使用することでした 'save_post' フックして、3つの非表示メタ値を適切な形式で節約します。 'YYYY-MM-DD', 'YYYY-MM''YYYY' たぶんメタキーで '_custom_date', '_custom_date_year_month' '_custom_date_year' SQLを変更したい他のプラグインにより回復力があります WHERE 句は、すべての投稿に3つの隠しカスタムフィールドを追加するため、多数の投稿を備えたブログにとっては良いアイデアではないかもしれません。

他のヒント

これを試して:

  • コピーします archive.php (index.php アーカイブ)テンプレートがない場合 date.php
  • date.php テンプレートの使用 query_posts() ソートをオーバーライドするには、使用する必要があります

ps hm、日付アーカイブは通常のようなものだと思います /year/month/, 、あなたは何を得るために使用していますか /archives/date/year/month/ ?..

PPS実際にマイクの答えを見た後、これは投稿の選択に影響を与えるのに十分ではないでしょう。これをスクラッチします。

はい - 使用する必要があります query_posts() また get_posts() または、自分でカスタムクエリを書きます。

ライセンス: CC-BY-SA帰属
所属していません wordpress.stackexchange
scroll top