在自定义查询中仅显示一个帖子表单中的帖子,并在主查询中排除

时间:2015-07-22 作者:HannesH

我试图先显示四篇带有post format的文章(全部分配给当前标记),然后显示特定标记的“真实”存档(不包括post format)。现在,我正在使用一个函数将post格式排除在主查询之外:

add_action(\'pre_get_posts\', \'keyl_get_emp_posts\');
function keyl_get_emp_posts($query) {
if (is_tag()) {
if ($query->is_main_query())
 $taxq = array(
    \'tag\' => $current_tag,
    array(
        \'taxonomy\' => \'post_format\',
        \'field\' => \'slug\',
        \'terms\' => array(
            \'post-format-aside\'
          ),
        \'operator\' => \'NOT IN\'
    )
);

    $query->set(\'tax_query\',$taxq);
}

}
然后,我尝试显示仅使用post格式的自定义查询

<div class="row">
<?php $current_tag = single_tag_title("", false);
$args = array(
    \'posts_per_page\' => 4,
    \'tag\' => $current_tag,
    \'post_type\' => array(\'post\', \'renvoeringsdamm\'),
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'post_format\',
            \'field\' => \'slug\',
            \'terms\' => array( \'post-format-aside\' )
        )
    )
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
  while ( $query->have_posts() ) {
    $query->the_post(); ?>
    <div class="col-sm-3 col-xs-6">
        <?php get_template_part( \'content\', get_post_format() ); ?>
    </div>
    <?php
  }
      wp_reset_postdata();
} ?>
</div>
但是,只查询post格式的特殊查询是显示所有类型post格式的post。。。所以我的问题是,到目前为止,我所做的到底有什么问题!。。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

我不怀疑你的tax_query 让你失望,但实际上tag 参数为。single_tag_title() 返回name 而不是鼻涕虫。

所有标记和类别查询都转换为tax_queryWP_Query 在传递给WP_Tax_Query 类来构建SQL查询的相对字符串。在验证之前以及在获取所传递术语的术语ID之前,术语名称和段塞会被清理干净。(出于兴趣,请阅读为什么不应使用术语名称和name a中的参数tax_query, 检查我的答案here

现在,鼻涕虫should 始终使用小写字母,多个单词之间用连字符分隔。你把一个名字当作鼻涕虫传递。因为术语名称与术语slug列中的任何内容都不匹配(,因为您已经告诉tax_query 要查看slug列,请执行以下操作:,WP_Tax_Query 接受术语无效且不存在,因此只需退出并返回空字符串。这就是最大的缺陷所在(我认为这是一个应该修复的bug)。WP_Tax_Query 将空SQL联接字符串发送回WP_Query, WP_Query 错误地解读这句话,好像从来没有tax_query 并继续构建并执行SQL,而不使用join子句。然后意外返回all 不管帖子在哪里,我认为它应该不返回任何帖子。这就是你看到的

因此,让我们来看一个解决方案,并清理您的代码,使其更加可靠

首先,你的pre_get_post 行动

添加一个只针对前端的检查,否则后端查询也会受到影响

设置is_tag() 到当前实例

获取当前tax_query 并对其进行修改,以添加帖子格式部分,并将其作为新的tax_query

您可以将代码调整为以下内容:(我使用闭包,但您可以恢复到您问题中的旧样式;-)

add_action(\'pre_get_posts\', function ($q) 
{
    if (    !is_admin() // Only targets front end queries
         && $q->is_main_query() // Only targets the main query
         && $q->is_tag() // Only targets tag archive pages  
    ) {
        // Gets the current tax_query
        $tax_query_obj = $q->tax_query->queries;
        // Add the post format query part to the current tax_query
        $tax_query_obj[] = [
            \'taxonomy\' => \'post_format\',
            \'field\' => \'slug\',
            \'terms\' => [\'post-format-aside\'],
            \'operator\' => \'NOT IN\'
        ];
        //Build a proper tax query
        $tax_query = [
            \'relation\' => \'AND\',
            $tax_query_obj
        ];
        // Set the modified tax_query
        $q->set( \'tax_query\', $tax_query );

        // Set any additional parameters here except tag parameters
    }
}, PHP_INT_MAX );
对于您的自定义查询,只需使用get_queried_object_id() 然后在tax_query 使用我们的帖子格式。您可以在参数中尝试以下操作:(由于新的短数组语法,需要PHP 5.4+)([])

$args = [
    \'tax_query\' => [
        [
            \'taxonomy\' => \'post_tag\', // Default tag taxonomy
            \'terms\' => get_queried_object_id(), // Gets current tag archive tag ID
        ],
        [
            \'taxonomy\' => \'post_format\',
            \'field\' => \'slug\',
            \'terms\' => \'post-format-aside\'
        ],
    ],
    // Rest of your arguments excluding tag parameter
];

结束

相关推荐

使用Functions.php的出列脚本

您好,我正在尝试将在我的队列中找到的脚本“jquery.favorite.js”退出队列。php:// WP_ENQUEUE_SCRIPTS static function wp_enqueue_scripts_callback() { global $javo_tso; $javo_register_scripts = Array( \'oms.min.js\'