如何根据自定义元值(日期)对CPT进行排序,并按月返回帖子

时间:2013-02-24 作者:Mr.Brown

For future reference:
我正在使用Meta Box Plugin 帮助加快自定义帖子类型的元框创建。

My goal:
构建一个高度可定制的活动部分,与传统日历非常相似,如get_calendar 创建,但用于特定的自定义帖子类型。

The Problem:
—完全依靠使用内置的WordPresstime parameters, 我可以按照类似于传统日历的ASC顺序返回我的帖子,但我仅限于显示截至当天的帖子,因为无法查询和返回scheduled posts - 这显然是一个问题,因为我需要显示当月以及以后的所有事件帖子
—此外,我还需要能够翻页到“之前”和“未来”的月份,类似于get_calendar.

My Solution Thus Far:
—由于时间参数的限制,我选择通过WP_Query\'smeta_key 参数,并将其分配给我的事件“startdate”字段,然后分配给orderby-meta_value_num...

这似乎在很大程度上复制了Im之后的相同功能,但现在我面临一个严重的问题:

“如何像对待WordPress本机时间参数一样对待此元值,以便我可以为每个月适当地存储此数据,并可以选择翻页浏览月份,类似于get\\u日历存档?”

希望我的解释足够明确,可以帮助任何读到这篇文章的人理解这一切。如果没有,请让我知道,我将很高兴尝试进一步澄清这是什么。。。谢谢你的帮助!

粘贴在下面的是我当前的“日历/事件”模板,以及它最有可能在前端显示的屏幕截图。

<?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

1 个回复
最合适的回答,由SO网友:Milo 整理而成

这不是完整的复制/粘贴代码,但希望它足够容易理解,以便您开始使用。

第一步是注册您的帖子类型,并添加重写规则来处理年/月。这将为您提供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_yearcalendar_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 - 下面是一个用普通数学建立链接的示例

( \'\' == 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 . \'/\';

结束

相关推荐

Problem with wp_update_post

我正在尝试编写一个插件,如果选中一个框(值1)并且帖子id不存在,那么它将创建一个页面。如果帖子id已经存在,那么我想用所做的任何更改来更新帖子。我有创建帖子(作为页面)的部分工作得很好。但是,当我尝试运行wp\\u update\\u post时,出现以下错误:array_merge() [function.array-merge]: Argument #1 is not an array in /home/wpovernight/wpovernight.com/wp-includes/post.php