自定义WP查询:某些分类强制输入,其他分类为可选

时间:2022-02-04 作者:TechyDude

我正在创建一个带有表单的搜索,以选择特定的分类法。

搜索需要输入2个项目,然后有3个可选术语。所有这些都是自定义的分类术语。因此,一旦用户点击搜索选项,我需要查询中的2个字段为必填字段,3个字段为可选字段。问题是我是否使用“关系”=>;\'“它迫使所有人都被要求。

有人能提供任何煽动吗?

$args = array(
 \'post_type\' => \'custom\',
 \'post_parent\' => 0,
 \'posts_per_page\' => 10,
 \'orderby\' => \'date\',
 \'order\' => \'DESC\',
 \'post_status\'=>\'publish\',
 \'paged\' => $paged,
 
 
 //tax
 \'tax_query\' => array(
    \'relation\' => \'AND\',
    array(
        \'taxonomy\' => \'required_1\',
        \'field\' => \'slug\',
        \'terms\' => array($required_1)
    ),
    
    array(
        \'taxonomy\' => \'required_2\',
        \'field\' => \'slug\',
        \'terms\' => array($required_2)
    ),

    
    array(
        \'taxonomy\' => \'optional_1\',
        \'field\' => \'slug\',
        \'terms\' => $optional_1
    ),
    array(
        \'taxonomy\' => \'optional_2\',
        \'field\' => \'slug\',
        \'terms\' => $optional_2
    ),
    array(
        \'taxonomy\' => \'optional_3\',
        \'field\' => \'slug\',
        \'terms\' => $optional_3
    )

)

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

很难说您的查询到底要完成什么,但我会提供我想到的两个设置,希望它们能帮助您。

您可以使用两个需要搜索的分类法和术语设置查询参数,如:

$args = array(
    \'post_type\' => \'custom\',
    \'post_parent\' => 0,
    \'posts_per_page\' => 10,
    \'orderby\' => \'date\',
    \'order\' => \'DESC\',
    \'post_status\'=>\'publish\',
    \'paged\' => $paged,
 
    //taxonomy query default
    \'tax_query\' => array(
        \'relation\' => \'AND\',
        array(
            \'taxonomy\' => \'required_1\',
            \'field\' => \'slug\',
            \'terms\' => array($required_1)
        ),
        array(
            \'taxonomy\' => \'required_2\',
            \'field\' => \'slug\',
            \'terms\' => array($required_2)
        ),
    ),
);
然后,如果您还希望使用前两个必需的术语搜索可选的分类法和术语,您可以动态地将另一个查询数组添加到$args[\'tax_query\'] 数组,具体取决于是否存在可选的分类术语。因此,税务查询将检查是否需要1个匹配项,如果需要2个匹配项,如果存在,则检查可选1个匹配项,如果可选2个匹配项,等等:

if( !empty($optional_1) ) {
    $optional_1_array = [
        \'taxonomy\' => \'optional_1\',
        \'field\' => \'slug\',
        \'terms\' => array($optional_1)
    ];

    $args[\'tax_query\'][] = $optional_1_array;
}
您可以对可能存在的其他可选术语进行清洗和重复,或者创建一个循环,以便将这些可选术语添加到查询中(如果您不知道可能会有多少个)。

想到的另一个查询可能是向使用关系或的数组动态添加可选术语,这些关系或嵌套在原始分类查询中。因此,前两个分类术语将使用AND,然后可选术语将在它们之间使用OR。换句话说,查询将检查是否需要1个匹配项,如果需要2个匹配项,以及可选1、可选2或可选3个匹配项中是否有任何一个匹配项。

这可能看起来像这样,但这是一段相当冗长的代码,可能需要更好地清理:

if( !empty($optional_1) || !empty($optional_2) || !empty($optional_3) ){
    // if any of the optional terms have been sent by user, setup new array with relation OR to start
    $optional_array = [
        \'relation\' => \'OR\',
    ];
    // then if $optional_1 was sent, store an appropriate array for that query nested inside of $optional_array
    if( !empty($optional_1) ) {
        $optional_1_array = [
            \'taxonomy\' => \'optional_1\',
            \'field\' => \'slug\',
            \'terms\' => array($optional_1)
        ];
        $optional_array[] = $optional_1_array;
    }
    
    $args[\'tax_query\'][] = $optional_array;
}