如何允许 URL 使用多个参数更改查询?
How to allow the URL to alter the query using multiple parameters?
我想根据通过 URL 传递的查询参数显示数据:https://example.com/?make=nike&model=shox&colour=white&body_type=slim
。
我可以通过访问 https://example.com/?make=nike
浏览 "nike" 个股票。
我可以通过访问https://example.com/?make=nike&model=shox
浏览"nike 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
,因为我得到了与查询无关的混合结果。
我可以访问 "white" https://example.com/?colour=white
.
我可以访问 "slim" 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
只有"working",因为shox
是最后一个参数,只有shox
个模型[=16] =].
你可以这样做:
$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 );
您可以在 $_GET
超全局上使用 foreach()
循环做得更干净。
$metaQuery = [];
foreach ( $_GET as $metaKey => $metaValue ) {
$metaQuery[] = [
'key' => $metaKey,
'value' => $metaValue,
'compare' => '=',
];
}
if ( count( $metaQuery ) > 0 ) {
$query->set( 'meta_query', $metaQuery );
}
我想根据通过 URL 传递的查询参数显示数据:https://example.com/?make=nike&model=shox&colour=white&body_type=slim
。
我可以通过访问
https://example.com/?make=nike
浏览 "nike" 个股票。我可以通过访问
https://example.com/?make=nike&model=shox
浏览"nike 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
,因为我得到了与查询无关的混合结果。我可以访问 "white"
https://example.com/?colour=white
.我可以访问 "slim"
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
只有"working",因为shox
是最后一个参数,只有shox
个模型[=16] =].
你可以这样做:
$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 );
您可以在 $_GET
超全局上使用 foreach()
循环做得更干净。
$metaQuery = [];
foreach ( $_GET as $metaKey => $metaValue ) {
$metaQuery[] = [
'key' => $metaKey,
'value' => $metaValue,
'compare' => '=',
];
}
if ( count( $metaQuery ) > 0 ) {
$query->set( 'meta_query', $metaQuery );
}