web-dev-qa-db-ja.com

カスタムメタ値(日付)でCPTを並べ替え、月ごとに投稿を返す方法

今後の参考のために
私のカスタム投稿タイプのメタボックス作成を迅速にするために、すばらしい Meta Box Plugin を使用しています。

私の目標
get_calendarが作成するような伝統的なカレンダーに酷似しているが、特定のカスタム投稿タイプのための高度にカスタマイズ可能なイベントセクションを構築するため。

問題:
- 時間パラメータ に組み込まれているWordPressを使用することのみに頼ることで、私は自分の投稿を従来のカレンダーと同様のASC順で返すことができますが スケジュールされた投稿 を返す方法がないため、現在の日付までの投稿を表示 - これは明らかに問題です。今月以降のすべてのイベント投稿を表示する必要があるためです。 ...
- さらに、私はget_calendarと同様に「前の」および「今後の」月にページングできるようにする必要があります。

これまでの私の解決策
- 時間パラメータの制限のため、代わりにWP_Querymeta_keyパラメータで投稿を返し、それを自分のイベントの "startdate"フィールドに割り当て、次にorderby - meta_value_num...を選択しました。

これは、Imとほとんど同じ機能を再現しているように見えますが、今は以下の深刻な問題を抱えています。

「月ごとにこのデータを適切に保存し、get_calendarアーカイブと同様に月をめくるオプションを持つことができるように、どのようにしてこのメ​​タ値をワードプレスのネイティブ時間パラメータと同じように扱うのですか。」

うまくいけば、私は私の説明でこれを読む人がそれをすべて理解できるようにするのに十分決定的だった。そうでなければ、私に知らせてください、そして私は喜んでそれが何であれそれをさらに明確にすることを試みるでしょう...そして助けをありがとう!


私の現在の "カレンダー/イベント"テンプレートと、それがフロントエンドでどのように見えるかのスクリーンショットを以下に貼り付けます。

<?php
/*
Template Name: Calendar
*/
?>

<?php get_header(); ?>

<!-- featured_images.php -->
<?php include ('featured_images.php'); ?>

    <div id="full_col">

        <h2 class="feed_title_full"><?php wp_title('', true); ?></h2>
        <div id="calendar_nav">
            <h4 id="current_month"><?php the_time( 'F Y' ); ?></h4>
        </div>

        <ul id="calendar">

            <?php $current_year = date('Y'); // Get current YEAR ?> 
            <?php $current_month = date('m'); // Get current MONTH ?>
            <?php $calandar_posts = new WP_Query(
                array(
                    'post_type' => 'calendar', 
                    'year' => $current_year,
                    'monthnum' => $current_month, // Show ALL posts for current Month 
                    'meta_key' => 'epr_startdate',
                    'orderby' => 'meta_value_num',
                    'order' => 'ASC', 
                    'posts_per_page' => -1, 
                    'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
                )); 
            ?>
            <?php if($calandar_posts->have_posts()) : while($calandar_posts->have_posts()) : $calandar_posts->the_post(); ?>

                <li class="calendar_entry">
                    <a href="<?php the_permalink(); ?>" class="calendar_link" title="<?php the_title_attribute(); ?>"></a>
                    <div class="entry_date">
                        <?php echo get_post_meta($post->ID, 'epr_startdate', TRUE); ?>
                    </div>
                    <div class="shadow_overlay"></div>
                    <?php the_post_thumbnail('calendar-teaser', array('class' => 'calendar-teaser-img', 'alt' => 'View Event')); ?>
                </li>

            <?php endwhile; else: ?>
                <h2>No Events for the month of <?php the_time( 'F' ); ?></h2>
            <?php endif; ?>
            <?php wp_reset_query(); ?>

        </ul>

    </div>

<?php get_footer(); ?>

enter image description here

2
Mr.Brown

これは完全なコピー/貼り付けコードではありませんが、開始するのに十分理解できることを願っています。

最初のステップは、投稿タイプを登録し、年/月を処理する書き換えルールを追加することです。これにより、event/post-name/で単一のイベントが、calendarで投稿タイプのアーカイブが提供され、calendar/yyyy/mm/の着信リクエストが処理されます。これが追加された後、設定>パーマリンクページにアクセスして、書き換えルールをフラッシュしてください。

function wpa88173_calendar_post_type() {

    // just the important bits shown here
    $args = array(
        'rewrite' => array( 'slug' => 'event' )
        'has_archive' => 'calendar',
    );

    register_post_type( 'calendar', $args );

    add_rewrite_rule(
        '^calendar/([0-9]{4})/([0-9]{2})/?',
        'index.php?post_type=calendar&calendar_year=$matches[1]&calendar_month=$matches[2]',
        'top'
    );

}
add_action( 'init', 'wpa88173_calendar_post_type' );

次のステップでは、calendar_yearおよびcalendar_monthクエリ変数を追加し、着信リクエストが解析されるときにWordPressがクエリ変数の配列に追加します。

function wpa88173_calendar_query_vars( $query_vars ) {
    $query_vars[] = 'calendar_year';
    $query_vars[] = 'calendar_month';
    return $query_vars;
}
add_filter('query_vars', 'wpa88173_calendar_query_vars' );

次のステップでは、pre_get_postsにアクションを追加します。これは、カレンダー投稿タイプのアーカイブであるかどうかを確認し、年/月をフェッチするか、現在の年/月に設定し、meta_queryパラメーターでクエリを変更して、要求された年/月を読み込みます。メタクエリの詳細については、 WP_Query を参照してください。これは、yyyymmddの日付形式を想定しています。

function wpa88173_calendar_query( $query ) {
    // is it a post type archive?
    if( ! $query->is_post_type_archive( 'calendar' ) )
        return;

    // is it the main query and not an admin page?      
    if( $query->is_main_query()
        && ! is_admin() ) {

        // check if year/month was set via the URI, or set it to current year/month
        ( ! empty( $query->query_vars['calendar_year'] ) ) ? $query_year = $query->query_vars['calendar_year'] : $query_year = date('Y');
        ( ! empty( $query->query_vars['calendar_month'] ) ) ? $query_month = $query->query_vars['calendar_month'] : $query_month = date('m');

        // meta_query parameters for events between start and end dates
        $date_start = $query_year . $query_month . '01';
        $date_end = $query_year . $query_month . '31';
        $meta_query = array(
            array(
                'key' => 'event_date',
                'value' => array( $date_start, $date_end ),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            )
        );

        // modify the query
        $query->set( 'meta_key', 'event_date' );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', $meta_query );

    }

}
add_action( 'pre_get_posts', 'wpa88173_calendar_query' );

最後のステップは、テンプレートでカレンダーを作成し、数か月にわたってページへの次/前のリンクを作成することです。 get_query_var を使用して、テンプレートでクエリされた年/月を取得できます。

EDIT-これは、単純なol '数学でリンクを構築する例です

( '' == get_query_var( 'calendar_month' ) ) ? $this_month = date( 'n' ) : $this_month = ltrim( get_query_var( 'calendar_month' ), '0' );
( '' == get_query_var( 'calendar_year' ) ) ? $this_year = date( 'Y' ) : $this_year = get_query_var( 'calendar_year' );

if( 1 == $this_month ):
    $next_month = 2;
    $prev_month = 12;
    $next_year = $this_year;
    $prev_year = $this_year - 1;
elseif( 12 == $this_month ):
    $next_month = 1;
    $prev_month = 11;
    $next_year = $this_year + 1;
    $prev_year = $this_year;
else:
    $next_month = $this_month + 1;
    $prev_month = $this_month - 1;
    $next_year = $this_year;
    $prev_year = $this_year;
endif;

$next_month = str_pad( $next_month , 2, '0', STR_PAD_LEFT );
$prev_month = str_pad( $prev_month , 2, '0', STR_PAD_LEFT );

echo 'next month: /calendar/' . $next_year . '/' . $next_month . '/';
echo 'previous month: /calendar/' . $prev_year . '/' . $prev_month . '/';
5
Milo