WP-CLI

Añade una barra de progreso a tus comandos WP-CLI

En entradas anteriores vimos parte de lo que podemos hacer con WP-CLI. Una de sus mayores virtudes es poder crear tus propios comandos para realizar acciones en lote, por ejemplo.

Últimamente me ha tocado desarrollar un par de comandos para importar y exportar información de una manera muy concreta, es decir, no podía utilizar el exportador de WordPress ni ningún plugin del repositorio.

Para ver cómo va la tarea una vez ejecutas el comando, es de mucha ayuda disponer de una barra de progreso, y en WP-CLI es muy fácil.

Haremos uso del método make_progress_bar, que recibe como parámetros el texto del encabezado y el número total de items a iterar:

$progress = \WP_CLI\Utils\make_progress_bar( 'Progress Bar', count((array)$posts) );

A continuación, en cada iteración del bucle llamaremos al método tick:

$progress->tick();

Y al finalizar el bucle:

$progress->finish();

Muy fácil, ¿no? Esto nos daría una información en pantalla muy útil para saber cómo va la ejecución de nuestro script

wp cli progress bar

Resumiendo

La clase donde creamos nuestro comando quedaría así:

<?php

class Import {
    /**
     * Import myposttype.
     *
     * ## OPTIONS
     *
     * [--dry-run]
     * : If set no changes will be made
     * ---
     * default: success
     * options:
     *   - success
     *   - error
     * ---
     *
     * ## EXAMPLES
     *
     *     wp mycommand myposttype --dry-run
     *
     * @when after_wp_load
     */
    public function myposttype( $args, $assoc_args ) {
        $report = $this->import_my_data( 'myposttype', $origin_url, isset( $assoc_args['dry-run'] ) );

        \WP_CLI\Utils\format_items( 'table', $report, array( 'ID', 'Title' ) );
    }

    private function import_my_data( $post_type, $url, $dry_run = true ) {
        $args = array(
            'post_type' => 'myposttype',
        );
        $posts = get_posts( $args );

        $progress = \WP_CLI\Utils\make_progress_bar( 'Progress Bar', count((array)$posts) );

        foreach ( $posts as $post ) {
            // your code and your actions
            $report[] = array(
                'ID' => $post->ID,
                'Title' => $post->post_title
            );

            $progress->tick();
        }

        $progress->finish();

        return $report;
    }
}

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *:

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios