根据上一次查询查询帖子

时间:2017-03-29 作者:RiotAct

我试图从自定义表中输出一些日历事件,这些日历事件也与自定义帖子类型相关联。除了在我的foreach循环中,每一行都重复最后一个日期之外,我还有其他工作要做。我需要一些帮助,使用正确的方法来正确获取$eventDate。这是我的代码:

<?php
$today = date(\'Y-m-d\');
global $wpdb;
$events = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."calp_events WHERE start >= \'$today\' ORDER BY start ASC LIMIT 5");
foreach ($events as $event) :
   $eventID = $event->post_id;
   $eventDate = $event->start;
endforeach;

global $post;
$args = array (
    \'post_type\' => \'calp_event\',
    \'ID\' => $eventID,
);
$myposts = get_posts($args);
foreach ($myposts as $post) : setup_postdata($post);
    echo $eventDate.\' \'.the_title().\'<br>\';
endforeach;
?>
不知何故,我需要能够在最后一个循环中获得$eventDate。

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

如评论中所述,而不是使用ID 获取每个\'calp_event\'-单独键入post,可以将ID数组传递给post__in 为了一次抓取它们,从而将代码中的数据库事务数减少到2个。

通过从第三方表查询的结果创建一个将post ID映射到事件开始日期的数组,可以轻松获得要传递到的值post__in 通过使用array_keys() 获取just-post-id的数组。然后在后面的循环中,您可以使用相同的post ID来查找开始日期映射。

由于您以类似于WordPress的“循环”的方式循环查询结果并使用模板标记,因此您还可以考虑使用新的WP_Query 对象而不是get_posts() 允许您使用更传统的“循环”逻辑来显示结果。

global $wpdb;

$today  = date(\'Y-m-d\');
$events = $wpdb->get_results( "SELECT * FROM " . $wpdb->prefix . "calp_events WHERE start >= \'$today\' ORDER BY start ASC LIMIT 5" );

// Create an array using event post IDs as keys and start dates as values
$eventDates = array();
foreach( $events as $event ) {
  $eventDates[ $event->post_id ] = $event->start;
}

// Query for the \'calp_event\' posts indicated by the earlier query.
// Since the keys of $eventDates are the post IDs returned by the previous query, 
// array_keys( $eventDates ) will return an array consisting of those IDs
$eventQuery = new WP_Query( array(
  \'post_type\' => \'calp_event\',
  \'post__in\'  => array_keys( $eventDates )
) );

// Use conventional Loop logic to display your results
if( $eventQuery->have_posts() ) {
  while( $eventQuery->have_posts() ) {
    $eventQuery->the_post();

    // Accessing the $eventDates array with the current post ID as a key will produce
    // the event start date which that ID is mapped to.
    echo $eventDates[ get_the_ID() ] . \' \' . the_title() . \'<br>\';
  }

  // Reset global post data so we don\'t muck up the main query
  wp_reset_postdata();
}
else {
  echo \'No upcoming events!\';
}
您可以通过使用更高级的SQL一次性获取所有必要的帖子和事件开始日期,将其简化为单个查询。

SO网友:Jigar Patel

你需要去nested loop. 试试这个

<?php
    $today = date(\'Y-m-d\');
    global $wpdb;
    $events = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."calp_events WHERE start >= \'$today\' ORDER BY start ASC LIMIT 5");

    global $post;

    foreach ($events as $event) :
       $eventID = $event->post_id;
       $eventDate = $event->start;
       $args = array (
        \'post_type\' => \'calp_event\',
        \'ID\' => $eventID,
       );
       $myposts = get_posts($args);
       foreach ($myposts as $post) : setup_postdata($post);
           echo $eventDate.\' \'.the_title().\'<br>\';
       endforeach;

       // wp_reset_postdata();
    endforeach;

?>
我将第二个foreach块移到了第一个块中,因此每次都会有不同的$eventID和$eventDate。如果每次都提供相同的数据,请尝试删除wp\\u reset\\u postdata();注释块。

相关推荐

无法在WordPress中通过PHP显示图像

我有一个奇怪的问题,当我尝试使用PHP输入图像标记的源代码时,它会在检查器中显示以下错误<img src=(unknown) alt=\"\"> 这个代码片段为我提供了正确的url,通过查看CPanel并粘贴和复制地址进行检查,但当我尝试通过php输入它时,不会显示图像$image = wp_get_attachment_image_src( $post_thumbnail_id); //echo($image[0]); ?> <img src=