自定义查询以检索最旧的帖子和按日期间隔检索其他帖子

时间:2020-01-31 作者:Mike Hermary

我希望实现一个自定义post查询,其中包括以下参数:

WordPress自定义循环,从自定义posttype中选择最旧的帖子并将其显示在页面上。有多个页面将使用此逻辑

Detailed Explanation

客户端的网站使用带有自定义模板的页面来显示从“发送”自定义帖子类型检索到的帖子。这些页面在内部称为“零售商”。零售商将在全年的不同时间加入该网站。每个零售商都是一家向其客户提供送出服务的企业。“发送”帖子将是一个通用池,可供所有零售商使用。客户将每隔十四天向WordPress添加新的“发送”帖子。创建新的零售商页面时,它将显示的第一篇帖子将是最旧的。此帖子将显示在页面上。十四天后,第二个最旧的“发送”帖子将显示在页面上,最旧的帖子将移动到HTML下拉菜单中。对于每个零售商页面,这将每十四天继续一次。

除非在同一天创建了两个页面,否则每个页面显示的“发送”帖子将是唯一的。可以使用页面创建日期或使用高级自定义字段来提供实现此功能所需的参数。

Base Code

$postDate = post_date_gmt(\'Y-m-d H:i:s\');

$args = array(
    \'post_type\' => \'sendouts\',
    \'cat\' => \'101\',
    \'order\' => \'ASC\',
    \'orderby\' => \'date\',
    \'date_query\' => array(
        \'after\' => \'post_date_gmt\',
        \'before\' => array(
            // Possibly use: $postDate->add(new DateInterval(\'P14D\')),
        ),
        \'inclusive\' => true,
     ),
     \'posts_per_page\' => -1,
);
query_posts($args);

Loop for HTML dropdown

<?php query_posts($args); ?>
    <?php if (have_posts()) : ?>
        <div class="sendout__nav-trigger">
            <button class="btn btn--nav-trigger">
                <span>Past Sendouts</span>
            </button>
        </div>
        <ul class="sendout__list">
        <?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>
            <li>
                <a href="<?php the_permalink(); ?>" rel="<?php the_ID(); ?>" class="sendout-link"><?php the_title(); ?></a>
            </li>
        <?php endwhile; endif; wp_reset_query(); ?>
        </ul>
    <?php else : ?>
        <p>
            <strong>Sorry, there are no retailer send outs to display.</strong>
        </p>
    <?php endif; ?>
我的PHP知识是新手,而我的WordPress知识是中级的,所以我可能用了错误的方法。

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

我已经用以下代码的一小部分快速测试了以下代码sendouts (3)更改使用此模板的我的页面的发布日期,效果良好

<?php
/**
* Template Name: show sendouts template
*
*/
get_header();
global $wpdb, $post;
$curDate=strtotime(date(\'Y-m-d H:i:s\'));

$postDate=strtotime($post->post_date);

$pageAge=($curDate-$postDate) / (60 * 60 * 24); // age of the page in days

$steps= 14; // days used as interval between the steps
$totSteps= intval($pageAge / $steps); // how many steps passed from the page publishing date

$Q = "SELECT ID, post_title FROM ".$wpdb->prefix."posts where post_type = \'sendout\' and post_status = \'publish\' ORDER BY post_date ASC LIMIT ".($totSteps + 1);

$sendouts=$wpdb->get_results($Q);
$dropDownoptions=[];

$dropDownoptions[]=\'<option value="" selected>Pick a sendout</option>\';
for($k = 0 ; $k < count( $sendouts) ; $k ++){
  if($totSteps == $k ){
    // use the post which corresponds to the current step as main post
    $mainPost =get_post($sendouts[$k]->ID);
  }
  else{
    // use the others to populate the dropdown
    $dropDownoptions[]= \'<option value = "\'.get_the_permalink($sendouts[$k]->ID).\'">\'.$sendouts[$k]->post_title.\'</option>\';
  }
}
// MAIN CONTENT
echo \'<h1>\'.$mainPost->post_title.\'</h1>\';
echo \'<p>\'.$mainPost->post_content.\'</p>\';
?>
<!-- DROPDOWN-->
<select id="sendout_select"><?php foreach($dropDownoptions as $option){echo $option;}?></select>
  <script>
    jQuery(function(){
      // bind change event to select
      jQuery(\'#sendout_select\').on(\'change\', function () {
          var url = jQuery(this).val(); // get selected value
          if (url) { // require a URL
              window.location = url; // redirect
          }
          return false;
      });
    });
</script>
<?
get_footer();

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post