web-dev-qa-db-fra.com

Supprimer la valeur de clé spécifique à la chaîne de requête

J'ajoute plusieurs valeurs de la même clé en tant que chaîne de requête avec la fonction add_query_arg pour filtrer les produits.

Le problème est que je veux supprimer uniquement la valeur du lien cliqué au lieu de l'ensemble du tableau de clés.

Par exemple, lorsque je clique sur ces 2 liens:

L'URL sera comme ça:

Mais lorsque je clique à nouveau sur l'un de ces liens, la chaîne de requête est supprimée complètement au lieu de simplement supprimer la valeur cliquée.

  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

[EDIT] Cela devrait fonctionner comme vous le souhaitiez:

  $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