WP CLI dispone di un comando specifico per effettuare operazioni di ricerca e sostituzione all'interno del database di WordPress. Questo comando è particolarmente utile in quanto permette di effettuare con semplicità delle operazioni che altrimenti richiederebbero una conoscenza più approfondita di MySQL. Il comando è wp search-replace
, esso cerca tra tutte le righe in una selezione di tabelle e sostituisce le occorrenze della prima stringa con la seconda.
N.B.: Il comando gestisce in modo intelligente i dati PHP serializzati, e non cambia i valori delle chiavi primarie.
wp search-replace
dispone di numerose opzioni che vale la pena elencare.
Opzione | Descrizione |
---|---|
<old> |
Stringa da cercare nel database. |
<new> |
Sostituisce le istanze della prima stringa con la seconda. |
[<table>...] |
Elenco di tabelle alle quali si desidera restringere la ricerca (supportate le wildcard, es. 'wp_post*' ). |
[--dry-run] |
Esegue l'operazione e mostra il risultato senza salvare dati nel database. |
[--network] |
Esegue ricerca e sostituzione nelle tabelle registrate di un'installazione multisite. |
[--all-tables-with-prefix] |
Opera su tutte le tabelle il cui nome corrisponde al prefisso specificato, anche se non registrate. |
[--all-tables] |
Abilita la sostituzione su tutte le tabelle, indipendentemente dalla loro registrazione. Sovrascrive –network e –all-tables-with-prefix . |
[--export[=<file>]] |
Scrive i dati modificati in un file SQL a parte invece di salvare le modifiche nel database. |
[--export_insert_size=<rows>] |
Definisce il numero di righe ammesse in una singola istruzione INSERT quando si esporta l'SQL. Potrebbe essere necessario cambiare questo valore a seconda della configurazione del database. Il valore predefinito è 50. |
[--skip-tables=<tables>] |
Non esegue operazioni su specifiche tabelle. I nomi vanno separati da virgole. |
[--skip-columns=<columns>] |
Non esegue le operazioni su specifiche colonne. I nomi vanno separati da virgole. |
[--include-columns=<columns>] |
Esegue le operazioni su specifiche colonne. I nomi vanno separati da virgole. |
[--precise] |
Forza l'utilizzo di PHP al posto di SQL. I risultati sono più precisi, ma le operazioni più lente. |
[--recurse-objects] |
Abilita la ricorsione negli oggetti per sostituire le stringhe. Il valore di default è true . Impostare –no-recurse-objects per disattivare. |
[--verbose] |
Stampa le righe modificate sulla console dopo la modifica. |
[--regex] |
Esegue la ricerca utilizzando un'espressione regolare senza limitatori. Questa operazione puù durare 15 o 20 volte di più di un'operazione normale. |
[--regex-flags=<regex-flags>] |
Passa i flag regex per eseguire l'operazione (ad esempio ‘i’ per "case insensitive"). |
[--regex-delimiter=<regex-delimiter>] |
Delimitatore utilizzato nella regex. Il valore di default è il risultato di chr(1) . |
[--format=<format>] |
Il formato dell'output (default: table ; opzioni: – table , – count , --- ). |
[--report] |
Produce un report. Di default è true . |
[--report-changed-only] |
Produce un report con i soli campi modificati. Di defaults è false a meno che non si esegua il logging. |
[--log[=<file>]] |
Registra gli elementi modificati ma causa un notevole rallentamento delle operazioni. |
[--before_context=<num>] |
Per le operazioni di logging, il numero di caratteri da mostrare prima della vecchia corrispondenza e della nuova sostituzione. Di default è 40. Viene ignorato se non si effettua il logging. |
[--after_context=<num>] |
Per le operazioni di logging, il numero di caratteri da mostrare dopo la vecchia corrispondenza e la nuova sostituzione. Di default è 40. Viene ignorato se non si effettua il logging. |
Esempio di ricerca e sostituzione
Si supponga di voler cambiare tutti gli URL di un certo tipo presenti nei contenuti del sito, ad esempio per un cambio di dominio, che costringe a passare da un URL tipo http://esempio.com
a https://miosito.it
.
Ecco il comando WP CLI:
wp search-replace 'http://esempio.com' 'https://miosito.it' nowp_posts --precise --recurse-objects --dry-run
Il risultato è mostrato nell'immagine che segue.
La query non è stata eseguita realmente dato che è stata impostata l'opzione --dry-run
. Per eseguire effettivamente il comando, basterà eliminare l'opzione:
wp search-replace 'http://esempio.com' 'https://miosito.it' nowp_posts --precise --recurse-objects
Si dovrà poi ricaricare la pagina per verificare il risultato dell'operazione.
È bene ricordare che le operazioni di scrittura sul database sono irreversibili. Prima di procedere è quindi indispensabile effettuare un back-up con il seguente comando:
wp db export backup-database.sql --all-tables
Inoltre, per essere sicuri della correttezza del comando che si andrà ad eseguire, è sempre bene utilizzare prima l'opzione --dry-run
.
Altra soluzione è effettuare la scrittura su un nuovo database che viene esportato senza modificare il precedente:
wp search-replace 'https://miosito.it' 'http://esempio.com' --export=database.sql --precise --recurse-objects
Il nuovo database sarà salvato come database.sql
nella directory di WordPress, ma non saranno apportate modifiche al vecchio database.