Как разрешить URL изменять запрос, используя несколько параметров? - PullRequest
0 голосов
/ 30 января 2019

Я хочу отобразить данные, основанные на параметрах запроса, переданных через URL: https://example.com/?make=nike&model=shox&colour=white&body_type=slim.

  1. Я могу просмотреть акции "nike", открыв https://example.com/?make=nike.

  2. Я могу просматривать "Nike Shox", открыв https://example.com/?make=nike&model=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 голосов
/ 30 января 2019

Каждый раз, когда вы звоните $query->set( 'key', 'value' );, предыдущее значение перезаписывается.

Если я угадаю правильно, параметры ?make=nike&model=shox только "работают", потому что shox - последний параметр, и есть только shox модели с make=nike.

Вы можете сделать что-то вроде этого:

$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 );
} 
...