【问题标题】:Get posts by year and meta key returns empty按年份获取帖子,元键返回空
【发布时间】:2013-02-27 22:41:22
【问题描述】:

我正在构建一个投资组合网站的 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(); ?>

…

这没有成功,因为术语已经具有标记某些东西的值,并且元值不适用于术语(!?)因为它仍然输出年份,即使帖子没有' t 有一个 meta_value。

所以我认为解决方案可能是使用 WordPress 自己的“发布”日期来按年份填充帖子。为此,我找到了一个 mysql sn-p 并进行了一些操作。

<?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 在他们的年度财产旁边获取帖子?

【问题讨论】:

    标签: mysql wordpress


    【解决方案1】:

    好的。

    我想这次我自己搞定了。第一个问题是:

    上述查询返回历史中特定日期期间的帖子, 即“X年,X月,X日的帖子”。他们无法获取 相对于现在的时间跨度的帖子,所以像“帖子”这样的查询 从过去 30 天开始”或“去年的帖子”是不可能的 使用基本查询,并且需要使用 posts_where 过滤器 完全的。下面的示例使用 posts_where 过滤器,并且应该 对于大多数时间相关的查询是可修改的。

    通过 WordPress CODEX。因此,如果您想 WP_query 特定年份,您还需要一个月。

    对于 MYSQL 查询部分,我使用了从 wordpress.org 论坛找到的代码并对其进行了修改。这可能不是最好的,但对我有用。

    按年份和元值获取 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;?>
    

    【讨论】:

      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2014-08-03
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多