製品をフィルタ処理するためにadd_query_arg関数を使用して、同じキーの複数の値をクエリ文字列として追加しています。
問題は、キー配列全体ではなく、クリックされたリンクの値だけを削除したいということです。
たとえば、私はこれらの2つのリンクをクリックすると:
URLは次のようになります。
しかし、これらのリンクの1つをもう一度クリックすると、クリックした値を削除するのではなく、クエリ文字列が完全に削除されます。
function custom_query_vars_filter( $vars ) {
$vars[] = 'marca';
return $vars;
}
add_filter( 'query_vars', 'custom_query_vars_filter' );
$marca = get_query_var('marca');
$marca_arg = isset($marca) && is_array($marca)
? $marca : [];
foreach ($marcas_terms as $marca_term) {
<a href="<?php echo (in_array($marca_term->slug, $marca_arg)) ?
esc_url(remove_query_arg('marca')) : esc_url(add_query_arg('marca[]',
"$marca_term->slug")); ?>" <?php echo (in_array($marca_term->slug,
$marca_arg)) ? "class='selected'" : '' ?>><?php echo $marca_term->name;
?></a>
}
[編集]これはあなたが望んでいた方法でうまくいくはずです。
$marca = get_query_var('marca');
$marca_arg = isset($marca) && is_array($marca)
? $marca : [];
$url_base = remove_query_arg( 'marca' );
$n = count( $marca_arg );
foreach ($marcas_terms as $marca_term) {
$selected = in_array( $marca_term->slug, $marca_arg );
if ( $selected ) {
$marca_arg2 = array_diff( $marca_arg, [ $marca_term->slug ] );
// Rebuils the indexes. Just remove if not necessary.
$marca_arg3 = [];
foreach ( $marca_arg2 as $slug ) {
$marca_arg3[] = $slug;
}
$url = add_query_arg( 'marca', $marca_arg3, $url_base );
$marca_arg2 = $marca_arg3 = null;
} else {
$url = add_query_arg( 'marca[' . $n . ']', $marca_term->slug );
}
?>
<a href="<?php echo esc_url( $url ); ?>" <?php echo $selected ? // wrapped
"class='selected'" : ''; ?>><?php echo $marca_term->name; ?></a>
<?php
} // End $marcas_terms loop.