# Wp Cli

Notas rápidas

# Tips rápidos para WP-CLI

## Introducción

Wp-cli es una herramienta muy potente para los webmaster y administradores de sitios. Es un cansancio y una hartura la falta de compromiso de los clientes y de sus empresas de mantenimiento de la página web (esos mismo que luego van diciendole al cliente que deberían migrar su contenido a sus servidores, que ellos, son diseñadores, desarrolladores, hostess, pintores y mecanicos de vuelo, si hace falta, pero luego no tienen ni backups, ni seguridad, ni nada)

## Actualiza todo

Funcionara si no hay problemas derivados por php obsoleto, algun plugin desastre, etc,

## Estructura de cPanel

```
cd ~/public_html && wp core update && wp plugin upgrade --all && wp theme upgrade --all
```

- Algunas veces puede darnos problemas de memoria. Un tip rápido [Error con WP-CLI en el shell con cPanel - PHP Fatal error: Allowed memory size of bytes exhausted](https://wiki.castris.com/books/cpanel-whm/page/error-con-wp-cli-en-el-shell-con-cpanel-php-fatal-error-allowed-memory-size-of-bytes-exhausted)

- Otras veces tenemos problemas con las versiones obsoletas de php, [Problemas por la versión shell usada y wp-cli](https://wiki.castris.com/books/wordpress/page/problemas-por-la-version-shell-usada-y-wp-cli-cpanel-version)

```bash
php -d memory_limit=512M "$(which wp)" core update && php -d memory_limit=512M "$(which wp)" plugin upgrade --all  && php -d memory_limit=512M "$(which wp)" theme upgrade --all
```


### Normal
```
wp core update && wp plugin upgrade --all && wp theme upgrade --all
```

## Usuarios
### Crear un administrador de Wordpress con wp cli
```
# wp user create
$ wp user create castris fake@castris.com --role=administrator
Success: Created user 12.
Password: 0VV3gUlNMECOPIESQUENOVALGOGFO4ht
```
### Borrar un usuario de Wordpress con wp-cli
```
wp user delete
wp user delete 12
--reassign parameter not passed. All associated posts will be deleted. Proceed? [y/n] y
Success: Removed user 12 from http://www.dunlopillo.es.
```

### Activar el auotupdate de los plugins

```bash
wp plugin auto-updates enable --all
```

[wp pluing](https://developer.wordpress.org/cli/commands/plugin/auto-updates/)

### Forzar la actualizacion del WP con WP Cli

A veces entramos en un bucle feo, proque el usuario tiene o anda con versiones 54, o simialr, y no hay manera.

Quizas tambien fue hackeado y manipulado.

```
wp core download --force
```

> Atención a este método. Siempre backup antes, por favor


#### Ejemplo
```
[comprascc@srv109 public_html]$ php -d memory_limit=512M "$(which wp)" core update && php -d memory_limit=512M "$(which wp)" plugin upgrade --all  && php -d memory_limit=512M "$(which wp)" theme upgrade --all
Fatal error: Uncaught Error: Call to undefined function get_magic_quotes_gpc() in /home/comprascc/public_html/wp-includes/load.php:926
Stack trace:
#0 /home/comprascc/public_html/wp-settings.php(400): wp_magic_quotes()
#1 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1374): require('/home/comprascc...')
#2 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1293): WP_CLI\Runner->load_wordpress()
#3 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Bootstrap/LaunchRunner.php(28): WP_CLI\Runner->start()
#4 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/bootstrap.php(83): WP_CLI\Bootstrap\LaunchRunner->process(Object(WP_CLI\Bootstrap\BootstrapState))
#5 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/wp-cli.php(32): WP_CLI\bootstrap()
#6 phar:///usr/local/bin/wp/php/boot-phar.php(20): include('phar:///usr/loc...')
#7 /usr/local/bin/wp(4): include('phar:///usr/loc...')
#8 {main}
  thrown in /home/comprascc/public_html/wp-includes/load.php on line 926
Error: El sitio está experimentando dificultades técnicas.
[comprascc@srv109 public_html]$ wp core update
Fatal error: Uncaught Error: Call to undefined function get_magic_quotes_gpc() in /home/comprascc/public_html/wp-includes/load.php:926
Stack trace:
#0 /home/comprascc/public_html/wp-settings.php(400): wp_magic_quotes()
#1 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1374): require('/home/comprascc...')
#2 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(1293): WP_CLI\Runner->load_wordpress()
#3 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Bootstrap/LaunchRunner.php(28): WP_CLI\Runner->start()
#4 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/bootstrap.php(83): WP_CLI\Bootstrap\LaunchRunner->process(Object(WP_CLI\Bootstrap\BootstrapState))
#5 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/wp-cli.php(32): WP_CLI\bootstrap()
#6 phar:///usr/local/bin/wp/php/boot-phar.php(20): include('phar:///usr/loc...')
#7 /usr/local/bin/wp(4): include('phar:///usr/loc...')
#8 {main}
  thrown in /home/comprascc/public_html/wp-includes/load.php on line 926
Error: El sitio está experimentando dificultades técnicas.
[comprascc@srv109 public_html]$ wp core update^C
[comprascc@srv109 public_html]$ wp core download --force
Downloading WordPress 6.6.1 (en_US)...
md5 hash verified: a15f676931133623b7b347f1fabc966b
Cleaning up files...
File removed: wp-includes/images/wlw/wp-comments.png
File removed: wp-includes/images/wlw/wp-watermark.png
File removed: wp-includes/images/wlw/wp-icon.png
File removed: wp-includes/Requests/Transport/fsockopen.php
File removed: wp-includes/Requests/Transport/cURL.php
File removed: wp-includes/Requests/Cookie/Jar.php
File removed: wp-includes/Requests/Auth.php
File removed: wp-includes/Requests/Hooker.php
File removed: wp-includes/Requests/IPv6.php
File removed: wp-includes/Requests/Exception/Transport/cURL.php
File removed: wp-includes/Requests/Exception/HTTP.php
File removed: wp-includes/Requests/Exception/Transport.php
File removed: wp-includes/Requests/Exception/HTTP/502.php
File removed: wp-includes/Requests/Exception/HTTP/Unknown.php
File removed: wp-includes/Requests/Exception/HTTP/412.php
File removed: wp-includes/Requests/Exception/HTTP/408.php
File removed: wp-includes/Requests/Exception/HTTP/431.php
File removed: wp-includes/Requests/Exception/HTTP/501.php
File removed: wp-includes/Requests/Exception/HTTP/500.php
File removed: wp-includes/Requests/Exception/HTTP/407.php
File removed: wp-includes/Requests/Exception/HTTP/416.php
File removed: wp-includes/Requests/Exception/HTTP/428.php
File removed: wp-includes/Requests/Exception/HTTP/406.php
File removed: wp-includes/Requests/Exception/HTTP/504.php
File removed: wp-includes/Requests/Exception/HTTP/411.php
File removed: wp-includes/Requests/Exception/HTTP/414.php
File removed: wp-includes/Requests/Exception/HTTP/511.php
File removed: wp-includes/Requests/Exception/HTTP/410.php
File removed: wp-includes/Requests/Exception/HTTP/403.php
File removed: wp-includes/Requests/Exception/HTTP/400.php
File removed: wp-includes/Requests/Exception/HTTP/505.php
File removed: wp-includes/Requests/Exception/HTTP/413.php
File removed: wp-includes/Requests/Exception/HTTP/404.php
File removed: wp-includes/Requests/Exception/HTTP/306.php
File removed: wp-includes/Requests/Exception/HTTP/304.php
File removed: wp-includes/Requests/Exception/HTTP/405.php
File removed: wp-includes/Requests/Exception/HTTP/429.php
File removed: wp-includes/Requests/Exception/HTTP/417.php
File removed: wp-includes/Requests/Exception/HTTP/409.php
File removed: wp-includes/Requests/Exception/HTTP/402.php
File removed: wp-includes/Requests/Exception/HTTP/418.php
File removed: wp-includes/Requests/Exception/HTTP/305.php
File removed: wp-includes/Requests/Exception/HTTP/415.php
File removed: wp-includes/Requests/Exception/HTTP/401.php
File removed: wp-includes/Requests/Exception/HTTP/503.php
File removed: wp-includes/Requests/Response.php
File removed: wp-includes/Requests/Utility/CaseInsensitiveDictionary.php
File removed: wp-includes/Requests/Utility/FilteredIterator.php
File removed: wp-includes/Requests/IRI.php
File removed: wp-includes/Requests/Response/Headers.php
File removed: wp-includes/Requests/Cookie.php
File removed: wp-includes/Requests/IDNAEncoder.php
File removed: wp-includes/Requests/Auth/Basic.php
File removed: wp-includes/Requests/Proxy.php
File removed: wp-includes/Requests/Transport.php
File removed: wp-includes/Requests/Session.php
File removed: wp-includes/Requests/Hooks.php
File removed: wp-includes/Requests/SSL.php
File removed: wp-includes/Requests/Proxy/HTTP.php
File removed: wp-includes/Requests/Exception.php
File removed: wp-includes/css/dist/editor/editor-styles-rtl.css
File removed: wp-includes/css/dist/editor/editor-styles-rtl.min.css
File removed: wp-includes/css/dist/editor/editor-styles.css
File removed: wp-includes/css/dist/editor/editor-styles.min.css
File removed: wp-includes/ID3/license.commercial.txt
File removed: wp-includes/wlwmanifest.xml
File removed: wp-includes/js/jquery/ui/widget.min.js
File removed: wp-includes/js/jquery/ui/position.min.js
File removed: wp-includes/js/wp-a11y.min.js
File removed: wp-includes/js/wp-a11y.js
File removed: wp-includes/random_compat/random.php
File removed: wp-includes/random_compat/byte_safe_strings.php
File removed: wp-includes/random_compat/random_bytes_com_dotnet.php
File removed: wp-includes/random_compat/random_bytes_dev_urandom.php
File removed: wp-includes/random_compat/random_int.php
File removed: wp-includes/random_compat/random_bytes_libsodium_legacy.php
File removed: wp-includes/random_compat/random_bytes_libsodium.php
File removed: wp-includes/random_compat/cast_to_int.php
File removed: wp-includes/random_compat/error_polyfill.php
File removed: wp-includes/random_compat/random_bytes_mcrypt.php
File removed: wp-admin/css/ie-rtl.css
File removed: wp-admin/css/ie.min.css
File removed: wp-admin/css/ie-rtl.min.css
File removed: wp-admin/css/ie.css
File removed: wp-admin/js/wp-fullscreen-stub.js
File removed: wp-admin/js/wp-fullscreen-stub.min.js
86 files cleaned up.
Success: WordPress downloaded.
```

## Actualizar WP Cli
Como root si la aplicación esta en el sistema de forma global
```
sudo wp cli update
You have version 2.5.0-alpha-3f4c34b. Would you like to update to 2.5.0? [y/n] Y
Downloading from https://github.com/wp-cli/wp-cli/releases/download/v2.5.0/wp-cli-2.5.0.phar...
md5 hash verified: 20ab512b12d766a2d2f51cc8f5c43411
New version works. Proceeding to replace.
Success: Updated WP-CLI to 2.5.0.
```

##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/cart.php?gid=18).

# Crear un sitio wordpress  con wp cli

# Introducción 
El uso de **wp cli** para la administración de sitios con wordpress es el paradigma de la eficiencia, sobre todo para los que amamos el shell. Una de las cosas que mejor podemos hacer es instalar wp desde shell.

## Requisitos previos
- Tener una base de datos
- Un usuario y su contraseña para usar deicha base de datos.
- Acceso shell

## Instalacion de wordpress en el shell con wp cli

Accedemos con nuestro usuario al servidor. 

El ejemplo que vamos a explicar es en un servidor con cpanel en el dominio principal.

Primero debemos confirmar que el certificado SSL se ha instalado, ya que es recomendable hacer la instalación sobre la base de usar https

[wp core download](https://developer.wordpress.org/cli/commands/core/download/)

```bash
$ cd public_html
$ wp core download --locale=es_ES
Downloading WordPress 5.7.2 (es_ES)...
md5 hash verified: 775ec9305bbe9729568fbc7b5fb7b71d
Success: WordPress downloaded.
```
[wp core config](https://developer.wordpress.org/cli/commands/config/)

```bash
$ wp core config --dbhost=localhost --dbname=DBNAME --dbuser=DBUSER --dbpass=PASSWORD
Success: Generated 'wp-config.php' file.
```

Verificamos por si hubo algun problema de escapoes o similar.
```php
cat wp-config.php | grep -i db
define( 'DB_NAME', 'cpuser_dbname' );
define( 'DB_USER', 'cpuser_dbuser' );
define( 'DB_PASSWORD', 'PaSsW0Rd€#?' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );
define( 'LOGGED_IN_KEY',     '/whuB6w+(RdHHHHHHHHHHHHHHH=wZ9Up3F0i!9Z@<Ey#P`@PDY^B;^[06Mgy' );
```

### cPanel permisos (PHP FPM)
Los permisos de cpanel para un servidor con PHP-FPM son especificos, y muchas veces la literatura en google de lso expertos, nos lleva a las tipicas cosas que no funcionan.

Por defecto instala ficheros con permisos 664 y 775 para directorios, lo cual no es permisible en cPanel en ese escenario.

#### Solución 
```bash
# Atención que el comando debe ejecutarse en el directrpoio public_html donde estabamos
# $ cd ~/public_html
$ find . -type f -exec chmod 644 {} \;
$ find . -type d -exec chmod 755 {} \;
$ chmod 750 ../public_html/
```

## Finalizar la instalación
[wp core install](https://developer.wordpress.org/cli/commands/core/install/)

```
$ wp core install --url=domainio.tld --title="We Welle" --admin_user=NOMBREADMIN --admin_password=contraseñasincaracteresextendidos --admin_email=email@user
Success: WordPress installed successfully.
```


##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/cart.php?gid=18).

# Mover un sitio web de un path a otro cambiando las url con wp cli

## Introducción

A veces a algun diseñador web se lo ocurrió aquello de hacer el sitio en el servidor de producción con una estructura domain.tld/wp o similar, y luego quiere moverlo a domain.tld

El soporte de su hosting y con razón le dirá que eso es una cuestión nuestra, y que no entra dentro del soporte, por lo que no nos ayudará o si lo hace, será bajao presupuesto. Normal, el trabajo no es gratis.

## Cambios por ejemplo para domain.tld/wp a domain.tld


En principio basta con acceder via, phpMyAdmin, MysqlWorkbench, TablePlus o similar a la tabla xxx_options para modificar los valores de `options_name` de las filas **site_url** y **home** por nuetsro nuevo path `domain.tld` tal y como nos indica Wordpress en su documentación, [Moving Worpdress](https://wordpress.org/support/article/moving-wordpress/)

También deberemos eliminar o corregir, mejor dicho, la configuración de nuestro .htaccess que contendría el path /wp

Pero bueno, esto a veces no es suficiente y algo falla, ya que incluso podemos acceder a nuestro area de administracion o tablero, con el nuevo dominio, pero wordpress nos idnica un 4040 en el sitio cuando tratamos de acudir a la nueva ubicación.

Es probable que halla restos del path antiguo en nuetsros posts, o en algun sitio de nuestro template, etc.

### wp search-replace

[wp search-replace](https://developer.wordpress.org/cli/commands/search-replace/) comando de **wp cli** que nos permitirá revisar la base de datos y corregir posibles problemas embutidos en nuestras tablas.

```
wp search-replace 'https://dominio.tld' 'https://dominio.tld'
```

Merece repasar las opciones como ```dry-run``` para no hacer cambios, o ```--export=database.sql``` que tampoco hace cambios pero exporta los cambios.


## Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos.  También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/cart.php?gid=18).

# Problemas por la versión shell usada y wp-cli (cPanel version)

##  Introducción
A veces podemos encontrarnos con un usuario con un Wordpress muy, muy obsoleto, y aunque tengamos la versión de PHP requerida en el shell, seguiremos teniendo problemas con wp cli
 porque este depende de la instalación de WP que tiene. La solución pasa por usar la versión php original

En cpanel es fácil hacer esto, 

> Aunque este tip es para cPanel, vale para cualquier distribución Linux o *nix. adaptando el tip a tu SO

Si buscas algo para Directadmin, te dejo aqu: [PHP en shell para usar wp cli en DirectAdmin](https://wiki.castris.com/books/directadmin/page/php-en-shell-para-usar-wp-cli-en-directadmin)

### Ejemplo 
```bash
 wp core update && wp plugin upgrade --all && wp theme upgrade --all
Fatal error: __autoload() is no longer supported, use spl_autoload_register() instead in /home/user/public_html/wiki.dominio.com/wp-includes/compat.php on line 502

 php -v
PHP 7.2.34 (cli) (built: Mar 28 2023 21:20:00) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with the ionCube PHP Loader + ionCube24 v10.4.5, Copyright (c) 2002-2020, by ionCube Ltd.
    with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies

```

El usuario tiene una versión correcta en la que todavía no estaba declarada obsoleta la función `__autoload()`

Así que vemos en el sistema que versiones hay y su path.

Como root podemos hacer 

```
whmapi1 php_get_installed_versions
---
data:
  versions:
    - ea-php54
    - ea-php55
    - ea-php56
    - ea-php70
    - ea-php71
    - ea-php72
    - ea-php73
    - ea-php74
    - ea-php80
    - ea-php81
    - ea-php82
metadata:
  command: php_get_installed_versions
  reason: OK
  result: 1
  version: 1
```

Así que las versiones que tenemos están en `/opt/cpanel/ea-phpXX/root/usr/bin/php`


Ahora solo nos queda llamar al wp-cli de forma adecuada
`72` es la versión que queremos usar
`/usr/local/bin/wp` es el path de instalación global de la herramienta wp 

```
/opt/cpanel/ea-php72/root/usr/bin/php /usr/local/bin/wp core update
```


##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/cart.php?gid=18).

# WP: Can't connect to local server through socket '/tmp/mysql.sock' pero funcionan otros comandos

## Introducción
Este es un problema extraño que se produce en algunos escenarios, ya que en el lugar donde ejecutamos este comando, funcionan perfectamente otros comandos habituales de `wp cli`.

Sin embargo, hay excepciones y a veces saltan errores extraños.

### Sistema con uso diferenciado de sockets

Al tratar de usar `wp db` en un sistema en el que hay alguna variación que no nos permite usarlo de la manera habitual, el usuario tiene en su `wp-config.php` los datos correctos y, siendo operativo el uso de `wp` en su directorio de instalación, obtenemos el siguiente error:


```bash
asociaci@srv120:~/domains/domain.com/public_html/portal$ wp db query "DELETE FROM wp_options WHERE option_name LIKE '_wp_session_%';"
Error: Failed to get current SQL modes. Reason: ERROR 2002 (HY000): Can't connect to local server through socket '/tmp/mysql.sock' (2)
```

> Este caso es un caso típico con DirectAdmin con su peculiar sistema de instalación de MySQL/MariaDB.

La **solución** es sencilla

1. Debemos obtener el path de [mysql.sock](https://wiki.castris.com/books/tips-para-programadores/page/mysql-conexion-via-socket-como-saber-donde-esta) correcto.
2. Modificar el `wp-config.php`para el valor `'DB_HOST'`;

```bash
define('DB_HOST', 'localhost:/usr/local/mysql/data/mysql.sock');
```

> Es el path de socket de Mysql obtenido con alguno de los métodos del punto 1.


Ahora, ya puedes ejecutar el comando sin problema alguno

> Este tipo de error, muchas veces limita el alcance de obtención de respuestas, pues muchas respuestas en internet estan asociadas a **el servidor esta caido**, **comprueba tus datos,...** que en realidad no tienen nada que ver.


##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/soporte-profesional).

# Forzar cambio de password pero conociendo el nuevo password de todos los usuarios

A veces es necesario un cambio global de Password, de ser administradores o de todos los usuarios, sobre todo cuando ha habido evidencias de un Explo o hacking un sitio web, algo que le cuesta mucho a muchos administradores, entender que es la seguridad.

## WP Cli

### Lista de usuarios

**administradores**
```
wp user list --role=administrator --fields=ID,user_login,user_email
```

**todos los roles**
```
wp user list --fields=ID,user_login,user_email
```

### Cambio de todos los administrrdores
```
wp user list --role=administrator --field=ID | while read uid; do
  newpass=$(openssl rand -base64 12)
  wp user update $uid --user_pass="$newpass" --skip-email
  login=$(wp user get $uid --field=user_login)
  echo "$login : $newpass"
done
```

##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/soporte-profesional).