web-dev-qa-db-ja.com

並べ替え順のカスタム分類テンプレート投稿リスト

解決しようとしている面白い問題があります。これが私の状況です:

  • "events"のカスタム投稿タイプを作成しました。
  • イベントの投稿ごとに、イベントの開始日時にカスタムフィールドを入力する必要があります。
  • さらに、各イベントを1つ以上の「イベントカテゴリ」(私のカスタム分類)に割り当てるために作成したカスタム分類に、各イベントを割り当てることができます。
  • このカスタム投稿タイプに属するすべての投稿を呼び出すパブリックテンプレートを作成しました。イベントの開始日と時刻が今日の日付よりも大きい場合のみ、クエリを正しく表示するようにイベントをフィルタリングしています。
  • 上記のすべてが正しく機能しています。

私が現在問題を抱えているのは、特定の分類用語に関するすべてのイベントを表示することだけです。

言い換えれば...各イベントリストとともに、私はカスタム分類法からのイベントに関連するすべての用語(イベントカテゴリ)を含めています。

そのため、ここで問題となるのは、各分類用語が(正しく)リンクとして表示されますが、用語を選択しても対応するアーカイブページがイベントの日付/時刻カスタムフィールドで対応する結果を並べ替えず、今日の日付より古いです。

このページに基づく: http://codex.wordpress.org/images/1/18/Template_Hierarchy.png

次のようにアーカイブファイルに名前を付けることで、カスタム分類法に属するすべての用語のカスタムアーカイブページを作成できることがわかりました。

taxonomy-event_categories.php( "event_categories")は、私のカスタム分類法の名前です。

Sooooooooo ....私が解決策を必要としていると私が思う唯一のことは、上記の2つの問題を達成するために挿入する正しいコードです。

これは私が使用しているコードで、今日よりも古いすべてのイベントを削除しながら、イベントの開始日時ごとに正しく整理された自分のイベントリストを表示するのに役立ちます。

<?php 
    //Get the metadata for each child page
    global $custom_metabox_event_dates;
    $meta1  = $custom_metabox_event_dates->the_meta();
       $today = time();
       $arrMonthNums = array("01" => "01", "02" => "02", "03" => "03", "04" => "04", "05" => "05", "06" => "06", "07" => "07", "08" => "08", "09" => "09", "10" => "10", "11" => "11", "12" => "12");
       $arrMonthNames = array("01" => "JANUARY", "02" => "FEBRUARY", "03" => "MARCH", "04" => "APRIL", "05" => "MAY", "06" => "JUNE", "07" => "JULY", "08" => "AUGUST", "09" => "SEPTEMBER", "10" => "OCTOBER", "11" => "NOVEMBER", "12" => "DECEMBER");
    query_posts('post_type=events&showposts=-1&meta_key=' . $custom_metabox_event_dates->get_the_name('combined_datetime') . '&meta_compare=>=&meta_value=' . $today . '&orderby=meta_value&order=ASC'); 
?>

  <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <?php  //Get all Events and run a check against current date
    global $custom_metabox_event_dates; 
    global $custom_metabox_event_details; 
    $meta1          = $custom_metabox_event_dates->the_meta(); 
    $meta2          = $custom_metabox_event_details->the_meta();
    $meta_start_date    = $meta1['event_start_date'];
    $meta_end_date  = $meta1['event_end_date'];
    $meta_start_time    = $meta1['event_start_time'];
    $meta_end_time  = $meta1['event_end_time'];
    $meta_location_city = $meta2['event_location_city'];
    $meta_event_type    = $meta2['event_type'];
    $show_date      = strtotime($meta_start_date);
        if($show_date >= $today) { ?>
           <?php 
            $show_month = date('m', $show_date);
            if ($arrMonthNums[$show_month] == $show_month) {
            echo "<div id='category-events-list-month-title'>EVENTS IN ".$arrMonthNames[$show_month]."</div>"; 
            $arrMonthNums[$show_month] = "printed";
            }
        if($show_date == $today) { 
            ?>   
           <?php } ?>
    <div id="category-events-list-container-group">
                     <div id="category-events-list-container-left">
            <div id="event-entry-list-date"><?php echo $meta_start_date ?></div>
            <div id="event-entry-list-time"><?php echo $meta_start_time ?> - <?php echo $meta_end_time ?></div>
            </div>
            <div id="category-events-list-container-right">
        <div id="category-articles-list-title"><a href="<?php the_permalink() ?>"><?php echo the_title(); ?></a></div>
        <div id="category-articles-list-excerpt">
        <span>EVENT TYPE: <?php echo get_the_term_list($post->ID, 'event_types', '', ', ',''); ?> </span><br />
        <span>LOCATION: <?php echo $meta_location_city ?></span><br />
        <?php echo substr(get_the_excerpt(),0,250); echo '...  ' ?></div>
        </div>
            </div>
    <?php } ?>
<?php endwhile; endif; ?>

1つの用語の投稿を表示するだけなので、上記のクエリを変更する方法を尋ねているのではないことに注意してください。むしろ、どういうわけか、私はどの用語がクリックされたのか私が上でやっている順序付け/フィルタリングを使って。

私はこれがおそらく私がまだ習得していない「ループ」を含む簡単な答えであると思います。

更新済み

これはアーカイブページのコードで、上記の結果リストから用語をクリックしたときに変更する必要があるため、同じ結果が表示されますが、選択された用語に対してのみ日付と時刻でソートされます。日付。

<?php if (have_posts()) : ?>
      <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
      <?php /* If this is a category archive */ if (is_category()) { ?>
        <div id="category-title-articles">Archive for the &#8216;<?php single_cat_title(); ?>&#8217; Category</div>
      <?php /* If this is a tag archive */ } elseif( is_tag() ) { ?>
        <div id="category-title-articles">Posts Tagged &#8216;<?php single_tag_title(); ?>&#8217;</div>
      <?php } ?>
<?php while (have_posts()) : the_post(); ?>
<div id="category-articles-list-container-group">
</div>
<?php endwhile; ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
</div>
<?php else :
    if ( is_category() ) { // If this is a category archive
        printf("<h2 class='center'>Sorry, but there aren't any posts in the %s category yet.</h2>", single_cat_title('',false));
    } else if ( is_date() ) { // If this is a date archive
        echo("<h2>Sorry, but there aren't any posts with this date.</h2>");
    } else if ( is_author() ) { // If this is a category archive
        $userdata = get_userdatabylogin(get_query_var('author_name'));
        printf("<h2 class='center'>Sorry, but there aren't any posts by %s yet.</h2>", $userdata->display_name);
    } else {
        echo("<h2 class='center'>No posts found.</h2>");
    }
    get_search_form();
endif; ?>

前もって感謝します、

クリス

4

最も効率的な方法はおそらくpre_get_postsアクションにフックしてそこにあなたの時間比較を追加することです。このようにすれば、残りの部分やクエリオプションについては心配する必要はありません。これは(テストされていない)次のようになり、プラグインまたはテーマ関数ファイルに配置されます(ページテンプレートファイルではなく、クエリーはすでに実行されています)。

add_action('pre_get_posts', 'add_event_date_criteria');
function add_event_date_criteria(&$query)
{
    // We only want to filter on "public" pages
    // You can add other selections, like here:
    //  - Only on a term page for our custom taxonomy
    if (!is_admin() &&
        is_tax('event_types')) {
        global $custom_metabox_event_dates;
        $query->set('meta_key', $custom_metabox_event_dates->get_the_name('combined_datetime'));
        $query->set('meta_compare', '>=');
        $query->set('meta_value', time());
        $query->set('orderby', 'meta_value');
        $query->set('order', 'asc');
    }
}

if()テストの内容を使用して、この追加のフィルタの範囲を定義します。現在、管理ページでは行っておらず(古いコンテンツにアクセスすることはできません)、特定の分類ページでのみ行っています。あなたは自分がこれを望んでいる幅や幅を自分で確かめるべきです。

この方法で解決できない場合は、メインの$wp_queryオブジェクトに別のクエリ変数を追加して$wp_query->get_posts()を再度呼び出すことで、 "ページ固有のクエリ"を失うことなくメインクエリを再度実行できます。 $wp_query->parse_query()を呼び出さなかったので、ページ固有のクエリ引数はクリアされません。これは次のようになります。

global $custom_metabox_event_dates;
$wp_query->set('meta_key', $custom_metabox_event_dates->get_the_name('combined_datetime'));
$wp_query->set('meta_compare', '>=');
$wp_query->set('meta_value', time());
$wp_query->set('orderby', 'meta_value');
$wp_query->set('order', 'asc');
$wp_query->get_posts();

あなたはこれをあなたのテンプレートファイル(functions.phpではなくtaxonomy-event_types.phpまたは他の「本当の」テンプレートファイル)に置くことができます。 1つのデータベース呼び出しをこのように「捨てる」ことを忘れないでください。そのため、これが最も最適な解決策ではありません。

7
Jan Fabry