【问题标题】:Separate query results by "week of" in a custom post type (Wordpress/PHP)在自定义帖子类型(Wordpress/PHP)中按“周”分隔查询结果
【发布时间】:2012-05-03 09:13:45
【问题描述】:

我有一个“事件”的自定义帖子类型,并且我有一个用于事件日期的自定义元框。以 srtotime() UNIX 格式添加的所有事件以及所有日期记录到数据库中。

当查询事件列表时,我需要按周将它们分开。所以..“4/23 周”然后仅列出该周的事件..然后是“4/30 周”列出该周的事件。

所有这些都需要动态和逻辑检测每周开始的时间,并将其与数据库中保存的返回事件的日期进行比较,从而将它们分组为“周”。

我希望一切都有意义。我只是在寻找此类功能的资源时遇到了麻烦,而且我不确定所需的逻辑以及 WP 可能已经拥有我可以使用的东西。 截至目前,结果是使用自定义 Wordpress 循环提取的,但如果需要,我可以使用 SQL。

提前感谢您以任何方式提供帮助!

*更新代码

<?php
$loop = new WP_Query(array(
'post_type'         => 'tf_events', 
'posts_per_page'    => -1, 
'orderby'           => 'meta_value', 
'meta_key'          => 'tf_events_startdate', 
'order'             => 'ASC'
));

echo '<pre>';
print_r($loop);
echo '</pre>';

$groups = array();

if ($loop->have_posts()) {
  while ($loop->have_posts()) {
    $loop->the_post();

    $groups['Week of ' . $post->post_date][] = $post;

// Get event dates from WP metabox data (returns as string) 
$longstartdate = get_post_meta($post->ID, 'tf_events_startdate', true); //get start date meta data
$longenddate = get_post_meta($post->ID, 'tf_events_enddate', true); //get start date meta data
$longweekof = get_post_meta($post->ID, 'tf_events_weekof', true); //get Week Of date meta data

// Reformat dates
$prettystartdate = date("D. M. j, Y", $longstartdate);
$prettyenddate = date("l, F j, Y", $longenddate); 
$prettyweekof = date("m/d", $longweekof);

// Get Custom Meta Terms/Catagories/taxonomies
$the_venue = get_the_term_list(  $post->ID, 'venue' );
$event_age = get_the_term_list(  $post->ID, 'event_age' );

// Get Custom Metabox Data - URL for Buy Tickets
$buytix = get_post_meta( $post->ID, 'buytix', true );
 }
}
?>

<h1>Groups of posts</h1>
<?php echo '<pre>'; print_r($groups); echo '</pre>';?>
<?php foreach ($groups as $week => $rows) : ?>
<h2><?php echo $week ?></h2>

<ul>
    <?php foreach ($rows as $post) : setup_postdata($post) ?>
    <?php echo ' <h1>POST START</h1> <pre>';
print_r($post);
echo '</pre> <h1>POST END</h1>'; ?>
        <li><a href="<?php the_permalink() ?>"><?php the_title() ?></a> <?php echo $prettystartdate; ?></li>
    <?php endforeach ?>
</ul>
<?php endforeach ?>

【问题讨论】:

  • 谁能帮助实施以下解决方案或其他选项?我仍然坚持这一点。

标签: php wordpress loops


【解决方案1】:

当我需要对元素进行分组时,我通常使用关联数组,其中键是分组依据。所以在你的情况下,数组看起来像:

array(
    'Week of 4/30' => array(array of posts)
);

一个简单的方法(一旦你有所有的帖子)是这样的:

$groups = array();

foreach ($posts as $post) {
    $groups['Week of ' . date('m/d', $post->pub_date)][] = $post;
}

然后你可以:

foreach ($groups as $title => $posts) {
     echo "<h2>$title</h2>";

     foreach ($posts as $post) ...
}

编辑:这是更完整的代码(包括 WP 查询等)的外观:

<?php
# Get all posts
$loop = new WP_Query(array(
    'post_type'         => 'tf_events', 
    'posts_per_page'    => -1, 
    'orderby'           => 'meta_value', 
    'meta_key'          => 'tf_events_startdate', 
    'order'             => 'ASC'
));
$groups = array();

# Create groups of posts
if ($loop->have_posts) {
    while ($loop->have_posts()) {
        $loop->the_post();

        $groups['Week of ' . date('m/d', $post->tf_events_weekof)][] = $post;
    }
}
?>

<h1>Groups of posts</h1>

<?php foreach ($groups as $week => $rows) : ?>
    <h2><?php echo $week ?></h2>

    <ul>
        <?php foreach ($rows as $post) : setup_postdata($post) ?>
            <li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li>
        <?php endforeach ?>
    </ul>
<?php endforeach ?>

【讨论】:

  • 据我所知,在您的示例中,它使用的是发布日期,但是如果我需要使用事件发生的实际日期怎么办。大多数事件发生在星期四、星期五或星期六……但我需要按“星期”列出那些事件发生前的星期日或星期一。如果我要为他们添加另一个自定义元框以输入“星期”日期然后按那个日期分组。
  • 您只需将$post-&gt;pub_date 更改为您想使用的任何其他变量。
  • 我当然感谢您的帮助,我显然在您的方法的实施中遗漏了一些东西。可能是我使用 $loop 而不是 $posts 进行调用,或者最初的 if 和 while 循环与 foreach 循环冲突。我尝试了各种我可能会解决的更改,但没有任何帮助。请在此 URL 上查看我的完整代码。 http://snipt.net/rellison959/testing-event-lists/ 在此处查看循环示例页面 http://www.6am-group.com/events_test/
  • 是的,您必须首先在while 循环中构建$groups 数组(不打印任何内容),然后然后 循环$groups 数组并打印HTML .您还试图循环一个不存在的 $posts 数组。只需删除该循环并仅保留 ` $groups['Week of ' 。 date('m/d', $post->tf_events_weekof)][] = $post`.
  • 我现在肯定迷路了。不确定我是否理解。
【解决方案2】:

这是对我有用的粗略解决方案。

<?php
$loop = new WP_Query(array(
'post_type'         => 'tf_events', 
'posts_per_page'    => -1, 
'orderby'           => 'meta_value', 
'meta_key'          => 'tf_events_startdate', 
'order'             => 'ASC'
));

$groups = array();
$heading = '';
if ($loop->have_posts()) {
while ($loop->have_posts()) {
    $loop->the_post();

//set up pretty week
$weekof = get_post_meta($post->ID, 'tf_events_weekof', true); //get Week Of date meta data
$longstartdate = get_post_meta($post->ID, 'tf_events_startdate', true); //get start date meta data
$longenddate = get_post_meta($post->ID, 'tf_events_enddate', true); //get start date meta data

//format dates
$prettyweekof = date("m/d", $weekof);
$prettystartdate = date("D. M. j, Y", $longstartdate);
$prettyenddate = date("l, F j, Y", $longenddate); 

//set info on objects
$post->prettyweekof = $prettyweekof;
$post->pretty_startdate = $prettystartdate;
$post->pretty_enddate = $prettyenddate;

//Echo heading when need to
if($post->prettyweekof !== $heading)
{
$heading = $post->prettyweekof;
echo '<h2>'.$heading.'</h2>';

}

//list events
echo $post->post_title.' | '.$post->pretty_startdate.' - '.$post->pretty_enddate.'<br />';


}
}
?>

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多