Как разрешить URL изменять запрос, используя несколько параметров?

Я хочу отобразить данные на основе параметров запроса, переданных через 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'] );

}

}

Что я делаю неправильно? Ура!

2

Решение

Каждый раз, когда вы звоните $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 );
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]