En el backoffice de WordPress podemos ver distintas páginas y listados de WordPress: posts, páginas, medios y otros tipos de posts que tengas preestablecidos en tu instalación. En dichas páginas y listados existe la posibilidad de realizar acciones en lote, es decir, acciones que afecten a varios registros. Cada una de esas páginas y listados cuenta con sus propias acciones en lote. Por eso, en este artículo, te mostraré cómo crear tus propias acciones en lote. Ojo, para seguir este tutorial debes tener nociones sobre desarrollo web puesto que utilizaremos código para modificar los archivos de WordPress.
Crear tus propias acciones en lote mediante código
El hook bulk-actions
En versiones anteriores de WordPress, el hecho de crear acciones en lote personalizadas en los listados del admin de WordPress era una tarea casi titánica. A partir de WordPress 4.7 eso cambió ya que añadieron un nuevo hook que lo hacía posible.
add_action('bulk_actions-{screen_id}', 'mi_accion_en_lote');
Como en el ejemplo utilizaremos la página de edición de posts, nombramos los parámetros en consecuencia:
add_filter( 'bulk_actions-edit-post', 'registro_acciones_en_lote' );
Esta sería la función a la que hace referencia el hook:
function registro_acciones_en_lote($bulk_actions) {
$bulk_actions['primera_accion'] = __( 'Mi primera accion en lote', 'domain');
$bulk_actions['segunda_accion'] = __( 'Mi segunda accion en lote', 'domain');
return $bulk_actions;
}
Como ves, puedes definir más de una acción en lote en cada función agregando simplemente más elementos al array $bulk_actions. Pero ojo, debes tener mucho cuidado a la hora de ponerle nombre a la clave de cada uno de dichos elementos y, logicamente, al texto que se va mostrar.
Los IDs de pantalla
Para referirnos a cada una de las páginas de WordPress, utilizamos ids de pantalla. En el ejemplo anterior, hemos utilizado bulk_actions-edit-post, siendo edit-post el ID de pantalla.
Puedes consultar el ID de pantalla mediante este código:
$screen = get_current_screen();
var_dump($screen);
Pero si alguna vez tienes alguna duda, aquí te dejamos los IDs de pantalla de algunas páginas del admin de WordPress:
Página | ID de pantalla | Archivo |
---|---|---|
Biblioteca de medios | upload | upload.php |
Comentarios | edit-comments | edit-comments.php |
Tags | edit-post_tag | edit-tags.php |
Plugins | plugins | plugins.php |
Usuarios | users | users.php |
Posts | edit-post | edit.php |
Páginas | edit-page | edit.php |
La función callback
Esta sería la función callback que utilizaremos en este ejemplo:
add_filter( 'handle_bulk_actions-edit-post', 'acciones_en_lote_nuevas', 10, 3 ); function acciones_en_lote_nuevas( $redirect_to, $action_name, $post_ids ) { if ( 'primera_accion' === $action_name ) { foreach ( $post_ids as $post_id ) { $post = get_post($post_id); // tu codigo } $redirect_to = add_query_arg( 'bulk_posts_processed', count( $post_ids ), $redirect_to ); return $redirect_to; } elseif ( 'segunda_accion' === $action_name ) { foreach ( $post_ids as $post_id ) { $post_meta = get_post_meta( $post_id ); // tu codigo } $redirect_to = add_query_arg( 'other_bulk_posts_precessed', count( $post_ids ), $redirect_to ); return $redirect_to; } else return $redirect_to; }
Como he mencionado antes, puedes definir más de una acción en lote personalizada, pero solo una función callback. Por lo tanto, lo primero que debes hacer en la callback es comprobar qué acción en lote se ha seleccionado (líneas 4 y 13).
Después, los posts son procesados en el bucle foreach (líneas 5 y 14). En este bucle puedes cargar el post con get_post o los meta con get_post_meta() y procesar los datos. A continuación, los datos modificados se escriben de nuevo en la base de datos con wp_update_post() o update_post_meta().
La variable $redirect_to (líneas 9 y 18) se utiliza para definir la URL a la que redirigiremos al usuario una vez se haya completado la acción en lote. En nuestro caso la hemos definido a …/wp-admin/edit.php?paged=1. En realidad no modificaremos la dirección, sino que la utilizaremos para pasar una variable mediante GET.
Con la función add_query_arg() añadimos un parametro a la URL que especifica el número de posts procesados: /wp-admin/edit.php?paged=1&bulk_posts_processed=1.
Mostrar el mensaje de OK
Despues de procesar todos los posts, puedes mostrar un mensaje de OK al usuario mediante la acción admin_notices(). El segundo parámetro de la función debe contener la cadena de texto que hemos definido en nuestro filtro bulk_actions-{id-de-pantalla}:
function my_bulk_action_admin_notice() {
if ( ! empty( $_REQUEST['bulk_posts_processed'] ) ) {
$posts_count = intval( $_REQUEST['bulk_posts_processed'] ); printf( '
' . _n( 'Procesado %s post.', 'Procesados %s posts.', $posts_count, 'domain' ) . ' ', $posts_count );
}
}
Y hasta aquí nuestro artículo en el que te enseñábamos cómo crear tus propias acciones en lote mediante código. Espero que te haya gustado y, si te ha resultado útil, no dudes en compartirlo en redes sociales. El artículo ha sido extraído del original de WPEngineer y el icono de la imagen destacada es obra de Victor Choi. ¡Nos leemos!