如何允许URL使用多个参数更改查询?

时间:2019-01-29 21:08:21

标签: php wordpress meta-query

我想基于通过URL https://example.com/?make=nike&model=shox&colour=white&body_type=slim传递的查询参数显示数据。

  1. 我可以通过访问https://example.com/?make=nike浏览“耐克”股票。

  2. 我可以通过访问https://example.com/?make=nike&model=shox浏览“ nike shox”。

  3. 我无法浏览“ nike shox white” https://example.com/?make=nike&model=shox&colour=white,因为得到的结果与查询无关。

  4. 我无法浏览“ nike shox white slim” https://example.com/?make=nike&model=shox&colour=white&body_type=slim,因为我得到的结果与查询无关。

  5. 我可以访问“白色” https://example.com/?colour=white

  6. 我可以访问“苗条” https://example.com/?body_type=slim

我正在使用以下代码

if ( isset( $query->query_vars['post_type'] ) && $query->query_vars['post_type'] == 'post' ) {

    // allow the url to alter the query
    if ( isset( $_GET['make'] ) ) {

        $query->set( 'meta_key', 'make' );
        $query->set( 'meta_value', $_GET['make'] );

    } 

    if ( isset( $_GET['model'] ) ) {

        $query->set( 'meta_key', 'model' );
        $query->set( 'meta_value', $_GET['model'] );

    } 
    if ( isset( $_GET['colour'] ) ) {

        $query->set( 'meta_key', 'colour' );
        $query->set( 'meta_value', $_GET['colour'] );

    }

    if ( isset( $_GET['body_type'] ) ) {

        $query->set( 'meta_key', 'body_type' );
        $query->set( 'meta_value', $_GET['body_type'] );

    } 

}

我在做什么错?干杯!

1 个答案:

答案 0 :(得分:3)

每次调用$query->set( 'key', 'value' );时,先前的值都会被覆盖。

如果我猜对了,则参数?make=nike&model=shox仅在“有效”,因为shox是最后一个参数,并且只有shox个带有make=nike的模型。 / p>

您可以执行以下操作:

$metaQuery = [];

if ( isset( $_GET['make'] ) ) {
    $metaQuery[] = [
        'key'     => 'make',
        'value'   => $_GET['make'],
        'compare' => '=',
    ];
}
if ( isset( $_GET['model'] ) ) {
    $metaQuery[] = [
        'key'     => 'model',
        'value'   => $_GET['model'],
        'compare' => '=',
    ];
}
if ( isset( $_GET['colour'] ) ) {
    $metaQuery[] = [
        'key'     => 'colour',
        'value'   => $_GET['colour'],
        'compare' => '=',
    ]; 
}
if ( isset( $_GET['body_type'] ) ) { 
    $metaQuery[] = [
        'key'     => 'body_type',
        'value'   => $_GET['body_type'],
        'compare' => '=',
    ];
}

$query->set( 'meta_query', $metaQuery );

您可以使用foreach()超全局变量上的$_GET循环来做得更干净。

$metaQuery = [];

foreach ( $_GET as $metaKey => $metaValue ) {
    $metaQuery[] = [
        'key'     => $metaKey,
        'value'   => $metaValue,
        'compare' => '=',
    ];
}

if ( count( $metaQuery ) > 0 ) {
    $query->set( 'meta_query', $metaQuery );
}