web-dev-qa-db-ja.com

クエリ文字列固有のキー値を削除します

製品をフィルタ処理するために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>
  }
1
Gabriel Souza

[編集]これはあなたが望んでいた方法でうまくいくはずです。

  $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.
2
Sally CJ