Я хочу отобразить данные на основе параметров запроса, переданных через URL: https://example.com/?make=nike&model=shox&colour=white&body_type=slim
,
Я могу просматривать акции «Nike», открыв https://example.com/?make=nike
,
Я могу просматривать «Nike Shox», открыв https://example.com/?make=nike&model=shox
,
Я не могу просматривать «Nike Shox White» https://example.com/?make=nike&model=shox&colour=white
так как я получаю смешанные результаты, не связанные с запросом.
Я не могу просматривать «Nike Shox White Slim» https://example.com/?make=nike&model=shox&colour=white&body_type=slim
так как я получаю смешанные результаты, не связанные с запросом.
Я могу получить доступ к «белым» https://example.com/?colour=white
,
Я могу получить доступ к «худой» 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'] );
}
}
Что я делаю неправильно? Ура!
Каждый раз, когда вы звоните $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 );
}
Других решений пока нет …