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.
Se vuoi aggiornamenti su CMS inserisci la tua email nel box qui sotto: