0

ポートフォリオサイトの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。

…</p>

そのため、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で年を取得しますが、リンク付きの投稿は1つだけで、2006年からの投稿は1つだけです!?

毎年の所属の横にあるがmeta_keyを使用して投稿を取得するにはどうすればよいですか?

4

1 に答える 1

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;?>
于 2013-02-27T14:41:22.473 に答える