我希望实现一个自定义post查询,其中包括以下参数:
WordPress自定义循环,从自定义posttype中选择最旧的帖子并将其显示在页面上。有多个页面将使用此逻辑十四天后,使用PHP/WordPress逻辑检索第二个最旧的帖子。此帖子将替换页面上最旧的帖子又过了十四天后,用同样的逻辑检索第三个最旧的帖子。这种逻辑应该持续十四天应使用相同的逻辑(略有变化)来填充HTML下拉菜单。此菜单将显示除页面上当前显示的标题、内容、自定义字段等以外的所有帖子。已安装高级自定义字段,如有必要,可在meta\\u查询中使用
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知识是中级的,所以我可能用了错误的方法。
最合适的回答,由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();