WordPress的:get_posts过滤器

时间:2018-10-17 09:01:38

标签: php wordpress search custom-fields

我正在尝试使用自定义字段在帖子中创建一些过滤器。 因此,在我的searchpage.php中添加了以下内容:

$args = array(
    'post_type'  => 'cp_course', 'numberposts' =>-1,'orderby' => 'ID', 'order' => 'ASC', 's' => $searchterm,
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key'   => 'course_code',
            'value' => $code,
        ),
        array(
            'key' => 'course_duration',
            'value' => $duration,
        )
    )
);

$course = get_posts($args);

但是如果我仅提供$code或仅提供$duration,则将无法正常工作,由于AND的关系,我必须同时提供它们。是否有比多个IFs更简单的方法来检查是否未提供$code,然后仅按$duration

来过滤帖子

编辑

通过使用ash0ur solution,我使用了以下代码:

$args = array(
    'post_type'  => 'cp_course', 'numberposts' =>-1,'orderby' => 'ID', 'order' => 'ASC', 's' => $searchterm,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'relation' => 'AND',
            array(
                'key'   => 'course_code',
                'value' => $code,
            ),
            array(
                'key' => 'course_duration',
                'value' => $duration,
            ),          
        ),
        array(
        'key'   => 'course_duration',
        'value' => $duration,
        ),
        array(
        'key'   => 'course_code',
        'value' => $code,
        )
    )
);

但是,如果要扩展它以添加更多搜索词,则会在数据库中遇到许多INNER JOIN查询,这会导致服务器出现问题。这是我尝试过导致问题的原因:

$args = array(
    'post_type'  => 'cp_course', 'numberposts' =>-1,'orderby' => 'ID', 'order' => 'ASC', 's' => $searchterm,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'relation' => 'AND',
            array(
                'key'   => 'course_code',
                'value' => $code,
            ),
            array(
                'key' => 'course_duration',
                'value' => $duration,
            ),  
            array(
                'key'   => 'course_iteration_start',
                'value' => $date_from,
            ),
            array(
                'key' => 'course_iteration_end',
                'value' => $date_to,
            ),  
        ),
        array(
        'key'   => 'course_duration',
        'value' => $duration,
        ),
        array(
        'key'   => 'course_code',
        'value' => $code,
        )
    )
);

其中course_iteration_startcourse_iteration_endsub fields course_iteration的{​​{1}}(重复者)。

1 个答案:

答案 0 :(得分:2)

您可以使用嵌套关系:

'meta_query' => array(
    'relation' => 'OR',
    array(
        'relation' => 'AND',
        array(
            'key'   => 'course_code',
            'value' => $code,
        ),
        array(
            'key' => 'course_duration',
            'value' => $duration,
        )
    ), 
    array(
        'key'   => 'course_duration',
        'value' => $duration,
    )
)