Come ottenere URL puliti con add_query_arg nei permalink
Con add_query_arg()
è comodo aggiungere parametri aggiuntivi a un URL ed è anche semplice creare una regola di rewrite. Fin qui tutto bene. Ma il problema è la sostituzione dell'URL effettuata da WordPress.
Quando ho un URL come:
www.miosito.com/?page_id=1&myvar=test
e digito questo URL nella barra degli indirizzi del browser con i permalink attivati. Questo link diventerà:
www.esempio.com/nomepagina/?myvar=test
MA: quello che vorrei ottenere è:
www.esempio.com/nomepagina/test
Infine, vorrei usare codice come:
<a href="<?php add_query_arg( 'myvar', 'test', get_permalink() ) ?>"> .... </a>
che dovrebbe risultare in:
www.esempio.com/nomepagina/test
Come posso ottenere questo risultato? Ho passato ore a leggere documentazione ma non sono riuscito a trovare una soluzione.

Mi sono appena imbattuto nella stessa situazione e ho trovato questa domanda durante una ricerca su Google.
Sembra che non sia possibile. Il core stesso aggiunge semplicemente stringhe all'URL se i permalink ottimizzati sono abilitati, vedi https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/link-template.php#L571
Per chiunque sia interessato a questo: puoi fare qualcosa del genere nel tuo codice:
if ( '' != get_option('permalink_structure') ) {
// utilizzando permalink ottimizzati, aggiungi all'url
$read = user_trailingslashit( get_permalink() . 'test' ); // www.example.com/pagename/test
} else {
$read = add_query_arg( 'test', '', get_permalink() ); // www.example.com/pagename/?test
}
Questa soluzione è stata anche raccomandata da Jon Cave in un commento sul blog ufficiale make: https://make.wordpress.org/plugins/2012/06/07/rewrite-endpoints-api/#comment-686

La soluzione per WordPress sarebbe aggiungere regole di riscrittura per ottenere qualcosa del genere:
add_action( 'init', 'my_rewrite_add_rewrites' );
function my_rewrite_add_rewrites()
{
add_rewrite_rule( 'calendar/([0-9]{4})/?$', 'index.php?post_type=events&year=$matches[1]', 'top' );
add_rewrite_rule( 'calendar/([0-9]{4})/page/?([0-9]{1,})/?$', 'index.php?post_type=events&year=$matches[1]&paged=$matches[2]', 'top' );
}
leggi di più: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule

WordPress non ti permetterà di farlo facilmente. Infatti, le regole di riscrittura sono l'unica opzione per ottenere questo tipo di risultato in WordPress, e le regole di riscrittura di WordPress possono diventare davvero confuse quando il tuo sito cresce, perché plugin e temi (e anche tu) potrebbero aggiungere regole di riscrittura personalizzate sopra quelle esistenti nella tua installazione (multi)sito.
La soluzione di @swissspidy funzionerà se hai già una regola di riscrittura per la tua chiave (myvar) e stai utilizzando i permalink nella prima condizione, per poi ripiegare sui tradizionali query string in assenza di quelle condizioni. La soluzione di @Johnathan Joosten mostra come le regole di riscrittura possano diventare molto complesse in WordPress (immagina di farlo per tutte le tue chiavi e valori dei query string...)
Mi sono imbattuto in questo problema diverse volte mentre lavoravo a progetti di medie dimensioni per i miei clienti e sono riuscito a ottenere qualcosa di simile utilizzando un plugin chiamato Obfusquer. Secondo il sito web, maschera tutti i query string di WordPress con chiavi segrete definite dall'utente e fornisce anche hook per esigenze personalizzate avanzate.
Curiosamente, non è elencato nel repository dei plugin di WordPress, e penso che avrai bisogno di un abbonamento (che ritengo sia davvero accessibile visto che una singola licenza funzionerà anche in installazioni multisito) ma ecco un link ad esso se hai bisogno di mascherare/nascondere i query string nelle installazioni di WordPress. Hanno anche una documentazione qui.
Ora utilizzo questo plugin in quasi tutti i miei progetti WordPress, spero che possa aiutarti anche te. Saluti.
