Quelle requête SQL pour effectuer une recherche et un remplacement simples

20

Chaque fois que je crée un nouveau site Web, je crée d'abord un site intermédiaire sur un sous-domaine comme "stage.domain-name.com".

Après que tout fonctionne correctement, j'exporte la base de données, l'ouvre dans notepad ++ et fais une recherche / remplacement pour "subdomain.domain-name.com" et je la remplace par "domain-name.com" ... enfin je l'importe dans un nouveau base de données pour le site en direct.

Ma question est ... quelle requête SQL aurais-je besoin d'exécuter si je voulais juste faire cette simple recherche / remplacement sur toute la base de données en utilisant phpmyadmin?

-CH

NetConstructor.com
la source
Si vous n'êtes pas familier avec les requêtes, essayez le plugin Rechercher et remplacer, wordpress.org/extend/plugins/search-and-replace
t31os
Pourquoi ne pas utiliser la fonctionnalité WordPress pour mettre à jour l'URL? codex.wordpress.org/Moving_WordPress détaille tout
Alex Older
Il existe un plugin pour cela. Il permet une utilisation confortable du backend et remplace également l'URL dans le post-contenu et certains autres champs, si vous le souhaitez: wordpress.org/plugins/better-search-replace
simonthesorcerer

Réponses:

13

Le tableau où votre URL est enregistrée est wp_options. Vous devriez faire une mise à jour sur les colonnes qui utilisent l'URL de votre site:

UPDATE TABLE wp_options SET option_value = "new domain" WHERE option_name = "siteurl"
UPDATE TABLE wp_options SET option_value = "new domain" WHERE option_name = "home"

Il se peut que je manque une valeur, mais chaque fois que vous effectuez à nouveau ce processus de recherche / remplacement, vous pouvez remarquer les valeurs et les tables qui doivent être mises à jour et les ajouter à ce script.

WordPress Codex a un bon guide sur la façon de changer l'URL d'un site, c'est peut-être encore plus pratique pour vous: Changer l'URL du site

Fernando Briano
la source
1
n'y a-t-il pas moyen de faire une recherche / remplacement sur toute la base de données? En d'autres termes ... J'ai remarqué par exemple que je dois remplacer les URL dans un tas d'emplacements différents, y compris la médiathèque .... S'il y avait une recherche / remplacement pour la base de données entière essentiellement pour chaque champ, cela résoudrait le problème. Merci pour votre aide
NetConstructor.com
Découvrez ce nouveau lien que j'ai ajouté sur la réponse. Je pense que ce serait la voie à suivre.
Fernando Briano
1
Cela ne fonctionnera pas pour les données sérialisées. Cela pourrait complètement casser une configuration de thème.
Christian Lescuyer
29

Mieux vaut faire des options, des messages, du contenu et des méta-messages:

UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET guid = replace(guid, 'http://olddomain.com','http://newdomain.com');

UPDATE wp_posts SET post_content = replace(post_content, 'http://olddomain.com', 'http://newdomain.com');

UPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');

Voir également Recherche de données à l'aide de phpMyAdmin et MySQL | Packt Publishing. Et Search RegEx est un bon plugin WP pour pouvoir rechercher et remplacer par Grep à travers toutes les publications et pages.

Mise à jour 16/06/2015: L' utilisation de l'outil lié dans la phrase suivante est bien meilleure, car une simple recherche / remplacement comme ci-dessus dans un vidage de base de données cassera les données sérialisées. Voir interconnectit.com WordPress Serialized PHP Search Replace Tool. De cette façon, vous ne cassez pas les données sérialisées et vous n'aurez pas besoin d'exécuter RegEx sur le contenu des publications, car le script d'interconnexion modifie les URL partout. J'utilise cet outil tout le temps pour migrer des sites vers différents domaines, ou pour simplement faire un changement global de http à https pour forcer SSL sans plugins et changer toutes les URL dans le contenu pour éviter les erreurs d'éléments non sécurisées.

Markratledge
la source
2
Ne changez jamais le guid - même si vous allez sur un nouveau domaine. Il est utilisé pour identifier de manière unique la publication, car l'ID peut changer si les publications sont exportées / importées dans une nouvelle base de données. D'une part, les lecteurs RSS utiliseront le GUID pour savoir si un article particulier a été lu ou non. Changer le guide republiera efficacement tous vos articles.
Taylor Dewey
@taylordewey a dit: "Ne changez jamais le guid ..." Déchets.
markratledge
1
@songdogtech Care pour expliquer pourquoi ce sont des déchets?
karité
1
Pourquoi voudrait - on avoir à changer le GUID?
kaiser
1
Cela ne fonctionnera pas pour les données sérialisées. Cela pourrait complètement casser une configuration de thème. Utilisez en effet un outil tel que Interconnect / IT.
Christian Lescuyer
9

C'est un excellent script que j'utilise et il fonctionne à merveille avec les tableaux sérialisés que WP utilise pour stocker les options. Assurez-vous simplement de le supprimer de votre serveur distant lorsque vous avez terminé, car c'est un énorme risque pour la sécurité.

https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

lancemonotone
la source
2
Je ne sais pas pourquoi j'étais -1'd. Ce script est bien meilleur qu'une instruction SQL. Des commentaires s'il vous plaît?
lancemonotone
1
un outil que les personnes qui ne connaissent pas sql peuvent utiliser, dérange ceux qui écrivent en sql
Jon
4

Pour cela j'utilise WP-CLI car je le trouve le plus simple et il s'occupe des données sérialisées.

wp search-replace 'http://example.dev' 'http://example.com' --skip-columns=guid

Il existe également une option qui écrit vos modifications dans un fichier SQL au lieu de manipuler la base de données réelle:

wp search-replace foo bar --export=database.sql

Jan Beck
la source
de loin la solution la plus robuste et la plus rapide. wp-cli sauve encore une fois la journée
ryanrain
3

vous n'avez pas à le faire, vous pouvez utiliser des chemins relatifs.

lorsque vous liez quelque chose au lieu de subdomain.soemthing.com/image.jpg - utilisez /image.jpg par exemple

comme ça, vous ne rencontrerez pas le problème en premier lieu.

sinon, pour une déclaration de mise à jour mysql, vous pouvez utiliser

update TABLE_NAME set FIELD_NAME = replace(FIELD_NAME, find this string’, replace found string with this string’);
mireille raad
la source
Merci ... ouais je le ferai la prochaine fois. L'instruction SQL effectue un remplacement de remplacement sur la base de données entière (y compris toutes les tables)?
NetConstructor.com
@ NetConstructor.com L'instruction SQL que mireille vous a donnée ci-dessus est la commande générique MySQL pour remplacer une chaîne dans un champ spécifique dans une table spécifique. Si vous essayez d'exécuter cette instruction exactement comme elle a été écrite, cela ne fonctionnera pas. Pour que cette commande fonctionne, vous devez changer le TABLE_NAME & FIELD_NAME en un véritable champ et table utilisés par WordPress.
Manzabar
Notez également que même si vous souhaitez utiliser des chemins relatifs, de nombreuses parties de wordpress ont tendance à insérer automatiquement des chemins complets. Pour vraiment faire fonctionner cela, un plugin comme: wordpress.org/plugins/root-relative-urls est très, très utile
benz001
2

Pour changer le domaine wordpress dont nous avons souvent besoin, cela peut être de faire vivre le site depuis localhost: Voici une liste complète des requêtes de mise à jour:

UPDATE wp_posts SET guid = replace(guid, 'http://olddomain.com','http://newdomain.com');
UPDATE wp_posts SET post_content = replace(post_content, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_links SET link_url = replace(link_url, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_links SET link_image = replace(link_image, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');
UPDATE wp_usermeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');

/*UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com') WHERE option_name = 'home' OR option_name = 'siteurl' OR option_name = 'widget_text' OR option_name = 'dashboard_widget_options';*/
UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com');
  • Nous devons également ajouter d'autres tables qui ne sont pas par défaut avec WP si nécessaire.

MISE À JOUR: Search Replace DB version 3.1.0 est un outil frontal convivial pour les développeurs, qui vous permet d'effectuer des actions de recherche / remplacement à l'échelle de la base de données, qui n'endommagent pas les chaînes ou les objets sérialisés PHP.

Reza Mamun
la source
2
Cela ne fonctionnera pas pour les données sérialisées. Cela pourrait complètement casser la configuration du thème.
Christian Lescuyer
-1

En fait, vous n'avez pas besoin d'utiliser une requête SQL juste quelques ajustements dans le fichier wp_config et functions.php dans votre thème. Consultez ce sujet dans Wordpress Codex: https://codex.wordpress.org/Changing_The_Site_URL

MEDZ
la source
1
Ce n'est pas correct. WordPress stocke malheureusement une URL dans la base de données sous forme de texte.
s_ha_dum