我正在构建一个投资组合网站的index.php,我希望按年份和meta_key显示帖子。元键用作“特色项目”选项。
一开始,我制作了一个自定义分类法“年份”,以不同的项目年份作为术语,并使用foreach来填充这些年份的帖子。
<?php $years = get_terms('year', 'orderby=name&order=desc&hide_empty=1'); ?>
<?php foreach( $years as $year ) : ?>
<div class="front-index"><p><?php echo $year->name; ?></p></div>
<?php
$year_query = array(
'post_type' => 'works',
'meta_key' => 'post_h2_mask',
'meta_value' => '1',
'taxonomy' => 'year',
'term' => $year->slug );
$year_posts = new WP_Query ($year_query);
?>
<?php while ( $year_posts->have_posts() ) : $year_posts->the_post(); ?>
…
这没有用,因为这些术语已经具有与之相关的价值,并且元值对于术语(!?)不起作用,因为它仍然输出年份,即使帖子没有有一个meta_value。
...
所以我认为解决方案可能是使用WordPress自己的“已发布”日期来按年填充帖子。为此,我找到了一个mysql片段,并对此进行了一些处理。
<?php
$years = $wpdb->get_col("
SELECT DISTINCT YEAR(post_date)
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type = 'works'
ORDER BY post_date DESC");
?>
<?php foreach( $years as $year ) : ?>
<div class="front-index"><p><?php echo $year; ?></p></div>
<?php
$year_query = array(
'post_type' => 'works',
'meta_key' => 'post_h2_mask',
'meta_value' => '1',
'year' => $year
);
$year_posts = new WP_Query ($year_query);
?>
<?php while ( $year_posts->have_posts() ) : $year_posts->the_post(); ?>
<?php
$attachments = new Attachments( 'attachments' );
if( $attachments->exist() ) :
?>
<div class="front-work">
<div class="wraptocenter">
<a href="<?php the_permalink() ?>" rel="bookmark">
<?php the_post_thumbnail('front-thumbnail'); ?>
<p><?php the_title(); ?><br /><span class="image-count">
<?php
$project_cats = get_the_terms($post->ID, 'medium');
$project_cats = array_values($project_cats);
for($cat_count=0; $cat_count<count($project_cats); $cat_count++) {
echo '<span>'.$project_cats[$cat_count]->name.'</span>';
if ($cat_count<count($project_cats)-1){
echo ', ';
}
}
?>,
<span><?php echo $attachments->total(); ?> images</span></span></p>
</a>
</div>
</div>
<?php endif; endwhile; ?>
<?php endforeach ?>
这会在他们的div中获得多年,但它只显示一个带有链接的帖子,而这只是2006年的一个帖子!?
如何使用meta_key获取其年度所有物旁边的帖子?
答案 0 :(得分:0)
行。
我想这次我自己得到了它。第一个问题是:
以上查询会返回历史记录中特定日期的帖子, 即“X年,X月,X日的帖子”。他们无法取 相对于现在的时间跨度的帖子,所以像“帖子”这样的查询 从过去30天“或去年的帖子”是不可能的 使用基本查询,并要求使用posts_where过滤器 完成。下面的示例使用posts_where过滤器,并且应该 可以修改大多数时间相关的查询。
通过WordPress CODEX。因此,如果您想要WP_query特定年份,您还需要一个月的时间。
对于MYSQL查询部分,我使用了wordpress.org论坛中找到的代码,然后摆弄它。它可能不是最好的,但对我有用。
按年份和meta_value获取WordPress帖子的代码:
<?php
$years = $wpdb->get_col("
SELECT DISTINCT YEAR(post_date)
FROM $wpdb->posts
LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_postmeta.meta_key = 'your_meta_key'
AND wp_postmeta.meta_value = 'your_meta_vaue'
AND post_status = 'publish'
AND post_type = 'your_post_type'
ORDER BY post_date DESC");
foreach($years as $year) :
?>
<p><?php echo $year ?></p>
<?php
$months = $wpdb->get_col("
SELECT DISTINCT MONTH(post_date)
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type = 'your_post_type'
AND YEAR(post_date) = '".$year."'
ORDER BY post_date DESC");
foreach($months as $month) :
?>
<?php
$posts = $wpdb->get_col("
SELECT $wpdb->posts.*
FROM $wpdb->posts
LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_postmeta.meta_key = 'your_meta_key'
AND wp_postmeta.meta_value = 'your_meta_value'
AND post_status = 'publish'
AND post_type = 'your_post_type'
AND MONTH(post_date) = '".$month."'
AND YEAR(post_date) = '".$year."'
ORDER BY post_date DESC");
foreach($posts as $post) :
?>
<!-- your specific post html & php -->
<?php endforeach;?>
<?php endforeach;?>
<?php endforeach;?>