Pre_Get_Posts-编辑查询,Tax_Query

时间:2017-07-05 作者:Josh Murray

我试图根据用户输入的内容过滤结果。

function custom_archive() {
    if ( is_post_type_archive( \'profiles\' ) ) {
        // if we are on a profiles archive page, edit the query according to the posted data.
        $data = $_POST[\'networks\'];

        if ( isset( $data ) ) {
            //count the array
            if ( count( $data ) > 1 ) {
                $data = implode( \',\', $data );
            } else {
                //$data = $data[0];
            }    

            //set the query to only search for whatever the user wants, eg news
            $wp_query->set( \'tax_query\', array(
                array(
                    \'taxonomy\' => \'networks\',
                    \'field\'    => \'id\',
                    \'terms\'    => $data,
                    \'operator\' => \'IN\',
                ),
            ) );
        }
    }
}
add_action( \'pre_get_posts\', \'custom_archive\' );
我已经调试了我的代码,数据输入正确。虽然,我没有收到回复。

这个代码有什么问题吗?我相信这个错误可能在我的主题的其他地方,但我确实希望检查一下这段代码,这样我就可以把它从等式中去掉。干杯

EDIT: 我应该提到的一件事是,我有一个版本的代码用于我的博客页面。我现在正在尝试将此代码用于存档,并使其在存档页面中返回正确的帖子,但它会将我重定向到搜索页面。

2 个回复
SO网友:Jacob Peattie

因此,代码有一些问题:

您没有使用传递给pre\\u get\\u posts挂钩的查询对象,因此您没有修改实际的查询字段设置为id 而不是term_id.IN 作为运算符,将数组传递给术语

  • 您没有清理$\\u POST[\'networks]的价值。如果没有它,您可能会没事,因为WordPress不应该让任何太糟糕的事情发生,但至少应该确保值的类型是正确的
  • 此版本的函数解决了以下问题:

    function my_query_by_selected_networks( $query ) {
        if ( is_admin() ) {
            return;
        }
    
        if ( $query->is_main_query() && $query->is_post_type_archive( \'profiles\' ) ) {
            if ( isset( $_POST[\'networks\'] ) ) {
                if ( is_array( $_POST[\'networks\'] ) ) {
                    $networks = array_map( \'intval\', $_POST[\'networks\'])
                } else {
                    $networks = array( intval( $_POST[\'networks\'] ) );
                }
    
                $tax_query = $query->get( \'tax_query\' ) ?: array();
    
                $tax_query[] = array(
                    \'taxonomy\' => \'networks\',
                    \'field\'    => \'term_id\',
                    \'terms\'    => $networks,
                    \'operator\' => \'IN\',
                );
    
                $query->set( \'tax_query\', $tax_query );
            }
        }
    }
    add_action( \'pre_get_posts\', \'my_query_by_selected_networks\' );
    
    注:

    函数接受$query 变量,并使用该变量更新查询term_id 作为的值field.

  • $networks, 传递给税务查询的值保留为数组,如果$_POST[\'networks\'] 不是数组$_POST[\'networks\'] 具有intval, 确保$networks 是一个整数数组,这是税务查询所期望的
  • 此外,我修改了tax\\u查询代码,以便它不会完全取代其他插件可能进行的任何tax查询。它通过检查是否已经有税务查询来实现这一点,如果已经有,则添加到税务查询中。这可能没有必要,但这是我的习惯。

    EDIT: 根据汤姆的建议,我加入了$query->is_main_query(), 为了确保我们只修改主循环,所以这不会影响小部件和菜单等。如果我们在管理中,我还在顶部添加了一点,因为我们不想修改后端查询。

    而且custom_archive 是一个非常通用的函数名,可以很容易地被其他插件或WordPress本身共享。最好更具描述性,但最重要的是,您应该在函数前面加上主题或插件特有的前缀,以避免冲突。在我的例子中my_. 我建议更换,因为my_ 是常见的示例前缀。

    SO网友:Picard

    您应该为tax\\u查询提供一个id数组,如下面的示例所示docs:

    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'actor\',
            \'field\'    => \'term_id\',
            \'terms\'    => array( 103, 115, 206 ),
            \'operator\' => \'NOT IN\',
        ),
    
    因此,您可以并且应该清理$_POST[\'networks\'] 但不应该进行内爆,这会将数组变成一个平面字符串。

    结束

    相关推荐

    使用新的WP-Query()从循环中过滤后期格式;

    嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post