J'aimerais automatiser la tâche d'importation d'une base de données distante à l'aide de WP-CLI .
Le processus actuel consiste à ssh
sur le serveur et à exécuter un export
dans un fichier à l'aide de WP-CLI , à copier le fichier dans un répertoire local via scp
ou rsync
, puis import
le fichier via l'interface de ligne de commande WP-CLI. Je voudrais utiliser un @alias
et supprimer autant d'étapes que possible ici.
Bien que j'aimerais penser quelque chose comme ceci est possible:
echo "$(wp @remote db export -)" | wp @local db import -
Avec une taille de base de données> 5 Go non compressée, cela semble être une option plus viable:
DB_EXPORT=$(echo "$(wp @remote db export -)" | gzip | base64 -w0); echo "$DB_EXPORT" | base64 -d | gunzip | wp @local db import -
Malheureusement, je suis peut-être en train de frapper les limites du terminal ou la structure de cet appel doit être nettoyée, car ma fenêtre semble juste se bloquer.
Existe-t-il une autre solution permettant de supprimer scp
de ce processus? Existe-t-il d'autres commandes que je pourrais utiliser ici? J'ai supprimé le multisite des exemples ici, mais c'est aussi un élément à prendre en compte qui pourrait faire partie de l'alias.
Idéalement, j'espère quelque chose comme ça à l'avenir:
wp @local db import @remote
Exemple d'utilisation actuelle de @alias
avec zone Basic Vagrant .
~/.wp-cli/config.yml
@basic:
ssh: basic.dev/var/www/wordpress/
~/.ssh/config
Host basic.dev
HostName basic.dev
User vagrant
IdentityFile ~/sites/basic.dev/.vagrant/machines/default/virtualbox/private_key
Mises à jour
Bases sur @davemac il semble que ce processus pourrait être facilement simplifié
wp db import - <<< $(wp db export -);
Il ne me reste plus qu'à prendre en compte le tables et site_url de MU-Site
wp @basic db export --tables=$(wp @basic db tables --url=http://basic.dev/site/ --format=csv) - | gzip > basic-dev-site.sql.gz
blog_id=$(wp @basic eval --url=http://basic.dev/site/ 'echo get_current_blog_id();');
prefix=$(wp @basic eval --url=http://basic.dev/site/ 'global $wpdb; echo $wpdb->prefix;')
site_url=$(wp @basic eval "echo site_url();")
Utiliser search-replace
- merci @WestonRuter
sql=$(wp search-replace $(wp eval "echo site_url();" | cut -d ":" -f2) "//new-site.com" --network --skip-columns=guid --export); printf "%s" "$sql"
WP multisite - exportez un site distant vers une importation locale sans fichiers:
wp @remote db export --tables=$remote_tables - | sed "s#$remote_prefix#$local_prefix#g" | sed "s#$remote_site_domain#$local_site_domain#g" | wp @local db import -
Similiar
wp --ssh=<Host>
Depuis WP-CLI 0.24.0 vous pouvez maintenant utiliser des alias qui vous permettent d'importer une base de données distante assez facilement.
En utilisant des alias, vous pouvez exécuter des commandes WP-CLI sur une autre installation WP-CLI. Cette installation pourrait être une machine distante.
Dans cet esprit, j'ai piraté un alias bash qui enchaîne plusieurs commandes WP-CLI pour extraire une base de données WP distante sur un site local. Dans ce cas, j'ai un fichier local wp-cli.yml dans lequel j'ai défini @prod comme alias de mon site de production (qui utilise un alias SSH).
pullprod() {
# make a backup of the current local database
wp db export _db.sql
wp db reset --yes
# get current directory name, used for database and URL
current=${PWD##*/}
# connect to remote site and ssh the remote database down to our local directory
wp @prod db export - > $current.sql
echo "copying of remote database to $current directory complete."
wp db import
# database is now imported so we can delete it
rm -rf $current.sql
# get the remote site URL, remove the http:// for our search replace
production_url=$(wp @prod eval '$full_url=get_site_url();$trimmed_url=str_replace("http://", "", $full_url); echo $trimmed_url;')
wp search-replace "$production_url" "$current.localhost"
echo "All done, enjoy!"
}
Une commande pullprod
dans le site WP actuel fera tout ce que vous souhaitez, tout comme l’alias est configuré (ce qui pourrait également être automatisé).
Cela fonctionne, mais ma tâche suivante consiste à améliorer la façon dont j'obtiens la variable $ production_url, car je la extrait actuellement d'un fichier local.