Query on custom field count?

时间:2010-11-25 作者:Martin-Al

我有以下代码:

            <div id="pc" class="smartbar-content">
            <ul class="smartbar-items">
            <?php
            $paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
            query_posts( array(
                        \'cat\' => \'6\', 
                        \'posts_per_page\' => 5,
                        \'meta_key\' => \'krit_karakter\',
                        \'orderby\'=> \'menu_order\',
                        \'order\'=> \'DESC\',
                        \'caller_get_posts\' => 1, 
                        \'paged\' => $paged ) );
                    if (have_posts()) : while (have_posts()) : the_post(); ?>
                    <li><a href="<?php the_permalink(); ?>"><img src="<?php bloginfo(\'url\');?>/wp-content/files_mf/<?php get_custom_field(\'game_poster\', TRUE); ?>" width="80" height="110" alt="<?php the_title();?>" /> </a>
                    <br /><?php the_title();?></a></li>

                    <?php endwhile; ?>
                    <?php else : endif; ?>
            </ul>
            <?php wp_reset_query(); ?>
        </div>
我只想显示在自定义字段“krit\\u karakter”中至少有5个条目的帖子。

这可能吗?

3 个回复
SO网友:Jan Fabry

以下代码允许您添加参数wpse4528_keywpse4528_minimum ,然后将向where子句添加一个额外的标准,该标准使用键计算元值的数量。

add_filter( \'posts_where\', \'wpse4528_posts_where\', 10, 2 );
function wpse4528_posts_where( $where, &$wp_query )
{
    global $wpdb;
    $count_key = $wp_query->get( \'wpse4528_key\' );
    if( $count_key ) {
        $where .= $wpdb->prepare( " AND (SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE {$wpdb->postmeta}.post_id = {$wpdb->posts}.ID AND {$wpdb->postmeta}.meta_key = %s) >= %d", $count_key, $wp_query->get( \'wpse4528_minimum\' ) );
    }
    return $where;
}

SO网友:Denis de Bernardy

您需要使用posts\\u groupby过滤器两次。它们可能看起来像这样:

function add_my_groupby($groupby, &$query) {
  global $wpdb;
  $groupby .= "$wpdb->posts.ID";
  return $groupby;
}

function add_my_having($groupby, &$query) {
  $groupby .= " HAVING COUNT(*) >= 5";
  return $groupby;
}
然后,您需要在模板中执行类似操作:

add_filter(\'posts_groupby\', \'add_my_groupby\', 10, 2);
add_filter(\'posts_groupby\', \'add_my_having\', 1000000, 2);

query_posts( array(/* your stuff...*/) );

remove_filter(\'posts_groupby\', \'add_my_groupby\', 10);
remove_filter(\'posts_groupby\', \'add_my_having\', 1000000);
(请注意,为第二个过滤器的优先级传递了非常大的数字。这是为了解决WP API中缺少具有过滤器的POST\\u的问题。)

或者,不要使用query\\u posts()垃圾,直接查询数据库,例如:

$wpdb->get_results("
  SELECT posts.*
  FROM $wpdb->posts as posts
  JOIN $wpdb->postmeta as postmeta
  ON postmeta.post_id = posts.ID
  AND postmeta.meta_key = \'whatever\'
  GROUP BY posts.ID
  HAVING COUNT(*) >= 5
  ORDER BY posts.post_date DESC
  LIMIT 5
");
更新:正如Jan所指出的,应该是这样的:HAVING COUNT(DISTINCT postmeta.post_id) >= 5 如果有其他连接。

SO网友:Rarst

我是否正确理解您在自定义字段中存储某种数组?

当WordPress将数组存储在数据库中时,数组被序列化(转换为纯文本)。由于查询是在MySQL级别上工作的,所以它无法对此类序列化数据运行任何有意义的操作。

您可以将要比较的计数(非数组值)存储在单独的字段中并使用meta_compare 要筛选的参数。

结束

相关推荐