仅当分类档案包含具有特定自定义字段值的帖子时才显示分类档案的链接

时间:2019-04-22 作者:thedorklord

我网站上的帖子描述了未来的事件,事件日期记录在Unix时间的自定义字段中。

一般来说,只有即将到来的活动与游客相关。因此,仅当分类法至少有一个即将发生的事件(事件日期>今天的日期)时,我才想显示到分类法存档的导航链接。

有没有比下面更聪明的方法?

<?php
$terms = get_terms( array(
    \'taxonomy\' => \'genre\',
    \'hide_empty\' => true,
) );

$today = time() - 86400;

foreach($terms as $term) {
    $query = new WP_Query( array( \'meta_key\' => \'event_date\', \'meta_value\' => $today, meta_compare => \'>=\', \'tax_query\' => array( array( \'taxonomy\' => \'genre\', \'field\' => \'term_id\', \'terms\' => $term->term_id, ), ), ) );
    if (($query->found_posts) > 1) {
    echo \'<li><a href="/genre/\' . $term->slug . \'">\' . $term->name . \'</a></li>\';
    }
} ?>
这正如预期的那样,但在每个页面加载中添加了大约100个查询,这有点令人不安。

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

有两种解决方案更聪明一点,我可以想到。。。

1。不要检索所有内容,你不需要这些帖子的所有信息。你所需要的只是计数,所以。。。您不必获取这些帖子的所有字段,也不必获取所有字段。。。

优化此代码的“更智能”方法是只查询与您的查询匹配的帖子ID,并将查询限制为仅一个结果。。。

<?php
$terms = get_terms( array(
    \'taxonomy\' => \'genre\',
    \'hide_empty\' => true,
) );

$today = time() - 86400;

foreach ($terms as $term) {
    $query = new WP_Query( array(
        \'meta_key\' => \'event_date\',
        \'meta_value\' => $today,
        \'meta_compare\' => \'>=\', 
        \'tax_query\' => array( 
            array( \'taxonomy\' => \'genre\', \'field\' => \'term_id\', \'terms\' => $term->term_id ),
        ),
        \'posts_per_page\' => 1,
        \'fields\' => \'ids\'
    ) );
    if ( $query->found_posts > 0 ) {
        echo \'<li><a href="/genre/\' . $term->slug . \'">\' . $term->name . \'</a></li>\';
    }
}
?>

2。如果这还不够优化

您始终可以编写只获取相关术语的自定义SQL查询。。。但这总是一种危险的方式,因为这样的查询将绕过过滤器。。。因此,如果有一个过滤器隐藏了一个术语或一些帖子,那么您的自定义查询将忽略它。

PS.

这不是打印术语链接的最佳方式:

<a href="/genre/\' . $term->slug . \'">
您应该使用get_term_link 而是:

<a href="\'. esc_attr( get_term_link( $term ) ) .\'">

相关推荐

Order by taxonomy Value

我确实想每年订购CTP。我有一个分类法叫做“annee”(年份),还有一个CTP叫做“moto”(摩托车)。问题是,当我试图按分类法排序时,它只按分类法ID排序,而不是按分类法值排序。你有什么解决办法吗?if ( is_post_type_archive( \'motos\' ) ) { $query->set( \'posts_per_archive_page\', 24 ); $query->set( \'order\', \'DESC\' );&