
📋 Chuleta completa de WordPress
¿Abrió functions.php y olvidó cómo enganchar la barra lateral? Le pasa a cualquiera que codifique a mano un tema de WordPress. Necesita una sola página a mano, no diez pestañas de developer.wordpress.org.
Aquí encontrará lo esencial para el desarrollo en WordPress: 13 archivos de plantilla y la jerarquía para elegirlos, el Loop básico, etiquetas de inclusión y parámetros de bloginfo(), luego hooks y filtros, etiquetas condicionales, encolado de scripts, shortcodes, WP_Query, escapado de datos, API REST y comandos de WP-CLI. Todos los ejemplos de código funcionan. Mantenga esta pestaña abierta durante el desarrollo y consúltela sobre la marcha.
💡 Resumen rápido:
- Marque esta página y manténgala abierta en una pestaña aparte mientras construye su tema.
- Empiece por la sección «Anatomía de un tema»: cree los archivos del tema de la lista antes de escribir código.
- Copie el Loop de WordPress básico en
index.phpy envuélvalo con etiquetas de inclusión para la cabecera, la barra lateral y el pie de página. - Inserte las etiquetas
bloginfo()yget_bloginfo()de la tabla directamente en las plantillas, verificando la columna «Qué muestra». - Antes de publicar, revise las reglas de
style.css: valide el CSS, minifíquelo y añada estilos de impresión. - Más abajo en la página, la referencia: jerarquía de plantillas, hooks y filtros, etiquetas condicionales, encolado de scripts, shortcodes,
WP_Query, escapado, API REST y WP-CLI.
Anatomía de un tema de WordPress

Un tema de WordPress es un conjunto de archivos PHP unidos por una lógica común y regidos por la jerarquía de plantillas. El componente clave: style.css, que maneja el estilo visual y a la vez sirve como identificador del tema en el administrador. Pero la base de cualquier tema clásico son las plantillas PHP: cada una maneja su propia sección de la página y se llama en el orden establecido por la jerarquía de WordPress.
Para crear un tema estándar necesita los siguientes archivos, trece en total, cada uno cubriendo una zona específica del sitio:
- header.php, la sección
<head>y la parte superior de la página: metadatos, título del sitio, inclusión destyle.css, etiqueta de apertura<body>. - index.php, la plantilla principal, punto de entrada. Ensambla otros archivos en una página unificada mediante etiquetas de inclusión. Si no existe una plantilla especializada, WordPress recurre a
index.php. - sidebar.php, la barra lateral: widgets, categorías, búsqueda, menú secundario.
- footer.php, el pie de página: derechos de autor, enlaces sociales, scripts de analítica, etiquetas de cierre
</body></html>. - page.php, plantilla para páginas (contenido estático, «Acerca de nosotros», «Contacto»).
- single.php, plantilla para una entrada individual del blog.
- comments.php, bloque de comentarios y formulario de envío.
- 404.php, página de error 404. Si falta este archivo, WordPress muestra un mensaje predeterminado del sistema, lo cual es peor para el visitante.
- search.php, plantilla para resultados de búsqueda.
- searchform.php, formulario de búsqueda (en temas clásicos; los modernos suelen usar un widget).
- archive.php, plantilla para archivos: categorías, etiquetas, archivos por fecha.
- functions.php, el corazón funcional del tema: hooks personalizados, encolado de scripts y estilos, registro de menús, áreas de widgets, tipos de contenido personalizados. Todo lo que añade funcionalidad al tema vive aquí.
- style.css, el único archivo no PHP de la lista, pero sin él el tema no existe: almacena la cabecera del tema y define la apariencia del sitio.
Puede arreglárselas con menos plantillas, por ejemplo, index.php + style.css ya forman un tema mínimo. Pero para un sitio completo es mejor mantener las trece: cada archivo está adaptado a su propia tarea, y WordPress mismo elige el correcto según la jerarquía. Un index.php típico tiene este aspecto:
1 <?php get_header(); ?> 2 3 <!-- Main content, including the Loop --> 4 5 <?php get_sidebar(); ?> 6 <?php get_footer(); ?>
Pasemos al fragmento de código más importante, sin el cual no se muestra ni una sola entrada.
El Loop de WordPress
El Loop es el mecanismo central para mostrar contenido. Sin él, tendría que codificar manualmente la visualización de cada entrada y cada página en la plantilla del tema. El Loop hace exactamente lo que su nombre promete: recorre todas las entradas que coinciden con la consulta actual y aplica a cada una el marcado HTML/PHP que usted especifique.
Sintaxis básica del Loop:
1 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> 2 <!-- HTML markup and template tags for each post --> 3 <?php endwhile; endif; ?>
have_posts() verifica si hay entradas que mostrar. Si las hay, the_post() inicializa el puntero interno de WordPress a la entrada actual, tras lo cual decenas de etiquetas de plantilla quedan disponibles dentro del Loop: the_title() para el título, the_content() para el texto de la entrada, the_permalink() para el enlace, the_excerpt() para el extracto y muchas otras.
El Loop suele colocarse en index.php para mostrar una lista de entradas, pero nada impide usarlo en single.php, page.php o archive.php; la lógica es la misma, solo cambia el contexto. Dentro del Loop añada cualquier envoltorio HTML y etiquetas PHP, WordPress los aplicará a cada entrada por turno.
Ejemplo práctico, mostrar el título y la fecha de cada entrada:
1 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> 2 <article> 3 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> 4 <time><?php echo get_the_date(); ?></time> 5 </article> 6 <?php endwhile; endif; ?>
Ahora, sobre cómo interactúa el Loop con el resto del tema, mediante etiquetas de inclusión.
Etiquetas de inclusión de plantillas
Las etiquetas de inclusión son funciones PHP que cargan el contenido de un archivo del tema dentro de otro. Forman el esqueleto de un index.php típico: cabecera, contenido, barra lateral, pie de página. Cuatro funciones básicas:
<?php get_header(); ?>, incluyeheader.php. Suele ser la primera línea enindex.phpy en cualquier otra plantilla que necesite cabecera.<?php get_sidebar(); ?>, incluyesidebar.php. Si no se necesita la barra lateral, simplemente elimine la llamada.<?php get_footer(); ?>, incluyefooter.php. Siempre al final de la plantilla, cierra la página.<?php comments_template(); ?>, incluyecomments.php. Se coloca dentro desingle.php, después de mostrar el contenido de la entrada.
Las cuatro funciones buscan archivos en la carpeta del tema activo. Si el archivo no existe, WordPress simplemente no muestra nada (excepto get_header() y get_footer(), cuya ausencia romperá la maquetación).
El siguiente nivel, etiquetas que no solo incluyen archivos sino que extraen datos de la base de datos.
Etiquetas bloginfo

Las etiquetas bloginfo() extraen información del sitio de la base de datos de WordPress, la misma información que usted completa en Ajustes → Generales y en el perfil de usuario. La función devuelve una cadena y la muestra inmediatamente en pantalla. Los parámetros más utilizados:
Parámetro | Qué muestra |
|---|---|
| Título del sitio |
| URL del sitio |
| Descripción corta (descripción del sitio) |
| Codificación de caracteres (por defecto UTF-8) |
| URL del |
| Versión de WordPress instalada |
| Idioma del sitio |
| URL del feed RSS (RSS 0.92) |
| URL del feed RSS (RSS 2.0) |
Esto es solo la punta del iceberg, la lista completa de parámetros está en la documentación de WordPress.
Get_bloginfo(), cuando necesita almacenar en lugar de mostrar
Para los casos en que la información del sitio deba usarse en el código en lugar de solo mostrarse en la página, utilice la función get_bloginfo():
1 <?php $info = get_bloginfo( $show, $filter ); ?>
$show, la palabra clave. Los valores admitidos son'name'(título),'url'(dirección),'description'(descripción corta),'admin_email'(correo electrónico del administrador) y otros; lista completa en la documentación.$filter, modo de filtrado:'raw'(valor «tal cual», predeterminado) o'display'(el valor se pasa porwptexturize(), convierte comillas, guiones, caracteres).
Ejemplo: obtener la descripción del sitio y mostrarla con un prefijo:
1 <?php $site_description = get_bloginfo( 'description' ); ?> 2 <?php echo 'Your site tagline: ' . esc_html( $site_description ); ?>
Resultado: «Your site tagline: Best premium WordPress themes».
Además de bloginfo, WordPress cuenta con un amplio sistema de etiquetas de plantilla: etiquetas generales, de autor, de miniatura, de categoría, de enlace, todas funcionan tanto dentro como fuera del Loop, y sus combinaciones otorgan un control total sobre la salida de contenido.
Hoja de estilos del tema
style.css cumple dos funciones. Primero, identificación: el encabezado al inicio del archivo le indica a WordPress el nombre del tema, autor, versión y licencia. Segundo, visual: todas las reglas CSS que controlan la apariencia del sitio. Un encabezado estándar se ve así:
1 /* 2 Theme Name: Theme Name 3 Theme URI: https://www.example.com/theme 4 Author: Your Name 5 Author URI: https://www.example.com/ 6 Description: Responsive WordPress theme with support for... 7 Version: 1.0 8 License: GNU General Public License v2 or later 9 License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 Tags: responsive, two-columns, right-sidebar, custom-header 11 Text Domain: mythemename 12 */
Buenas prácticas al trabajar con style.css:
- Siga los estándares de codificación CSS de WordPress, un estilo consistente simplifica el mantenimiento.
- Valide el CSS con el validador de la W3C.
- Minimice el CSS en producción, pero conserve una fuente legible para desarrollo.
- Agregue estilos de impresión (
@media print), muchos lectores imprimen artículos. - Estilice todos los elementos HTML estándar que puedan aparecer en el contenido de las entradas.
Jerarquía de plantillas de WordPress
Para cada solicitud, WordPress decide por sí mismo qué archivo PHP del tema incluir, esta es la jerarquía de plantillas. Una regla: del archivo más específico al más general, con index.php como último recurso para cualquier rama. Conocer el orden elimina la pregunta «¿por qué mi edición en single.php no se muestra en la página de categoría?».
1 Single post → single-{post_type}-{slug}.php → single-{post_type}.php → single.php → singular.php → index.php 2 Page → {template from editor}.php → page-{slug}.php → page-{id}.php → page.php → singular.php → index.php 3 Category → category-{slug}.php → category-{id}.php → category.php → archive.php → index.php 4 Archive → archive-{post_type}.php → archive.php → index.php 5 Search → search.php → index.php 6 404 error → 404.php → index.php 7 Front page → front-page.php → home.php → index.php
WordPress toma el primer archivo existente de izquierda a derecha. Así, single-product.php anulará a single.php solo para las entradas del tipo de contenido product, dejando el resto intacto.
Hooks: acciones y filtros
Los hooks son puntos de extensión de WordPress: le permiten engancharse a la funcionalidad del núcleo sin editar sus archivos. Las acciones ejecutan un efecto secundario (encolar un script, enviar un correo), los filtros reciben un valor, lo modifican y deben devolverlo. Un return olvidado en un filtro es la causa más común de contenido vacío.
1 // Registration 2 add_action( 'hook_name', 'callback', 10, 1 ); // priority, number of arguments 3 add_filter( 'hook_name', 'callback', 10, 1 ); 4 5 // Execution (in core or your code) 6 do_action( 'hook_name', $arg ); // action: returns nothing 7 apply_filters( 'hook_name', $value, $arg ); // filter: RETURNS value 8 9 // Removal (priority must match the one used when adding) 10 remove_action( 'hook_name', 'callback', 10 );
Ejemplo, añadir un párrafo al final de cada entrada:
1 add_filter( 'the_content', 'my_append_note', 20 ); 2 function my_append_note( $content ) { 3 return $content . '<p>Thanks for reading!</p>'; // without return content disappears 4 }
Hooks clave del tema:
after_setup_theme, registra el soporte de funciones (add_theme_support()), menús, tamaños de miniaturas.wp_enqueue_scripts, el único lugar correcto para encolar CSS y JS del frontend.init, inicialización temprana: registra tipos de contenido y shortcodes.the_content, filtra el HTML de la entrada antes de la salida.
Una prioridad más baja se ejecuta antes (por defecto 10). Para que un callback reciba más de un argumento, aumente el cuarto parámetro accepted_args.
Etiquetas condicionales
Las etiquetas condicionales son funciones que devuelven true o false según la página que esté abierta en ese momento. Construyen la lógica de «mostrar barra lateral aquí, pero no en la página 404».
1 is_home() // blog post feed 2 is_front_page() // site front page 3 is_single() // single post 4 is_page() // single page 5 is_singular() // any single post/page/CPT 6 is_archive() // any archive 7 is_category() // category archive 8 is_search() // search results page 9 is_404() // 404 error page 10 is_user_logged_in() // user is logged in 11 is_admin() // request is in admin (NOT "user is administrator")
Principal trampa: las etiquetas condicionales de consulta (is_single, is_page, is_home y otras) solo funcionan después de que se forme la consulta principal, es decir, dentro de los archivos de plantilla y el Loop o a partir del hook template_redirect. Llamarlas temprano en functions.php o en init es demasiado pronto: WordPress emitirá _doing_it_wrong() y devolverá un resultado incorrecto. Las excepciones son is_admin() e is_user_logged_in(), que no dependen de la consulta y están disponibles antes. Y recuerde: is_admin() verifica el contexto (admin vs frontend), no el rol; para el rol use current_user_can( 'manage_options' ).
Encolado de scripts y estilos
La tentación de escribir <link> y <script> directamente en header.php es fuerte, pero es un error: pierde la gestión de dependencias, el versionado para invalidación de caché, las estrategias defer/async y la protección contra la carga doble (dos plugins pueden fácilmente encolar jQuery dos veces). El camino correcto es la cola de WordPress en el hook wp_enqueue_scripts.
1 add_action( 'wp_enqueue_scripts', 'my_theme_assets' ); 2 function my_theme_assets() { 3 // Theme style with version from style.css header 4 wp_enqueue_style( 5 'my-theme', 6 get_stylesheet_uri(), 7 array(), 8 wp_get_theme()->get( 'Version' ) 9 ); 10 11 // Script with dependency and modern syntax (WP 6.3+) 12 wp_enqueue_script( 13 'my-app', 14 get_theme_file_uri( 'assets/js/app.js' ), 15 array( 'jquery' ), // dependencies 16 '1.0.0', // version → cache busting 17 array( 18 'in_footer' => true, 19 'strategy' => 'defer', 20 ) 21 ); 22 }
A partir de WordPress 6.3 el último parámetro de wp_enqueue_script() es un array $args (in_footer, strategy), aunque la forma antigua con el booleano true para el footer todavía funciona. Para el frontend use wp_enqueue_scripts, para el admin use admin_enqueue_scripts, para la página de acceso use login_enqueue_scripts.
Shortcodes
Los shortcodes convierten una entrada breve entre corchetes en HTML arbitrario, práctico para botones, galerías y formularios dentro del contenido. El manejador debe devolver una cadena, no imprimirla con echo, de lo contrario el resultado «saltará» al principio de la página.
1 add_shortcode( 'btn', 'my_button_shortcode' ); 2 function my_button_shortcode( $atts, $content = null, $tag = '' ) { 3 $a = shortcode_atts( 4 array( 'url' => '#', 'label' => 'Button' ), 5 $atts, 6 $tag 7 ); 8 return sprintf( 9 '<a class="btn" href="%s">%s</a>', 10 esc_url( $a['url'] ), // escape on output 11 esc_html( $a['label'] ) 12 ); 13 } 14 // Usage in post: [btn url="https://example.com" label="Buy"]
shortcode_atts() superpone los atributos del usuario sobre los valores predeterminados. Si necesita ejecutar shortcodes dentro de una cadena o plantilla, envuélvala en do_shortcode(), pero para llamar a su propia función hágalo directamente, sin el intermediario.
WP_Query y consultas personalizadas
WP_Query es la clase para cualquier selección de entradas: últimas noticias en la barra lateral, colección de categoría, feed de tipo de contenido personalizado. Después de su loop siempre llame a wp_reset_postdata(), de lo contrario las etiquetas de plantilla más abajo en la página obtendrán la entrada equivocada.
1 $q = new WP_Query( array( 2 'post_type' => 'post', 3 'posts_per_page' => 5, 4 'category_name' => 'news', 5 'orderby' => 'date', 6 'order' => 'DESC', 7 ) ); 8 9 if ( $q->have_posts() ) { 10 while ( $q->have_posts() ) { 11 $q->the_post(); 12 the_title( '<h3>', '</h3>' ); 13 } 14 wp_reset_postdata(); // restore global $post 15 }
Para modificar la consulta de la página principal (por ejemplo, número de entradas en la portada), no use el obsoleto query_posts(), ejecuta una consulta adicional a la base de datos y rompe la paginación. El enfoque correcto es el hook pre_get_posts, que modifica la consulta antes de su ejecución:
1 add_action( 'pre_get_posts', 'my_main_query' ); 2 function my_main_query( $query ) { 3 if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) { 4 $query->set( 'posts_per_page', 12 ); 5 } 6 }
Seguridad: escape y saneamiento
La regla de oro de WordPress: sanear al ingresar, escapar al mostrar, validar en todas partes. Cualquier dato de usuario se limpia antes de guardarlo en la base de datos y se escapa antes de mostrarlo en HTML, incluso si ya fue limpiado previamente.
1 // Escaping ON OUTPUT 2 echo esc_html( $text ); // text inside tag 3 echo esc_attr( $value ); // attribute value 4 echo esc_url( $href ); // href/src links 5 echo wp_kses_post( $rich_html ); // safe HTML set for content 6 7 // Sanitization ON INPUT (before writing to DB) 8 $clean = sanitize_text_field( $_POST['name'] ); 9 $email = sanitize_email( $_POST['email'] ); 10 $num = absint( $_POST['count'] );
Proteja los formularios y las acciones con nonces, tokens de un solo uso contra CSRF:
1 // In form: 2 wp_nonce_field( 'my_save_action', 'my_nonce' ); 3 4 // During processing: 5 if ( ! isset( $_POST['my_nonce'] ) || 6 ! wp_verify_nonce( $_POST['my_nonce'], 'my_save_action' ) ) { 7 return; // request rejected 8 }
En la práctica, la mayoría de las vulnerabilidades en temas y plugins son precisamente por omitir el escape en la salida. Conviértalo en un hábito: ni una sola variable va al HTML sin esc_*.
API REST de WordPress
La API REST devuelve los datos del sitio en formato JSON, utilizada por aplicaciones móviles, frontends desacoplados e integraciones. La dirección base es /wp-json/wp/v2/.
1 GET /wp-json/wp/v2/posts // posts 2 GET /wp-json/wp/v2/pages // pages 3 GET /wp-json/wp/v2/media // media files 4 GET /wp-json/wp/v2/users // users 5 GET /wp-json/wp/v2/posts/123 // single post 6 GET /wp-json/wp/v2/posts?per_page=5&search=theme&_embed
Las rutas personalizadas se registran en el hook rest_api_init. El parámetro permission_callback es obligatorio; sin él, WordPress emitirá una advertencia; para lectura pública use '__return_true'.
1 add_action( 'rest_api_init', function () { 2 register_rest_route( 'myplugin/v1', '/items/(?P<id>\d+)', array( 3 'methods' => 'GET', 4 'callback' => 'my_get_item', 5 'permission_callback' => '__return_true', 6 ) ); 7 } );
WP-CLI: comandos a mano
WP-CLI administra el sitio desde la terminal, más rápido y fiable que hacer clic en el administrador, especialmente al mantener múltiples sitios. Comandos más comunes:
1 wp core update # update WordPress core 2 wp core version # what version is installed 3 wp plugin install akismet --activate # install and activate plugin 4 wp plugin list # plugin list with status and version 5 wp theme activate twentytwentyfive # switch active theme 6 wp db export backup.sql # database dump to file 7 wp search-replace 'old.com' 'new.com' --dry-run # always dry run first 8 wp user create bob [email protected] --role=editor # create user 9 wp cache flush # flush object cache
wp search-replace entiende los datos serializados, por lo que cambia de forma segura el dominio al migrar un sitio, a diferencia de una consulta SQL directa que rompe la serialización. Antes de cualquier operación peligrosa, ejecute wp db export.
Temas clásicos y de bloques en 2026
A mediados de 2026 (versión actual: WordPress 7.0 «Armstrong», PHP 8.3+ recomendado), los temas PHP clásicos siguen teniendo soporte completo y continúan siendo el tipo más extendido. Pero todas las nuevas herramientas del núcleo se desarrollan para temas de bloques y edición completa del sitio (Full Site Editing): theme.json en lugar de parte de los ajustes de functions.php, plantillas HTML en lugar de PHP. El Loop, bloginfo(), las etiquetas condicionales y los hooks siguen siendo relevantes en temas híbridos y en cualquier fragmento PHP dentro de temas FSE, así que esta hoja de referencia no pierde valor. El camino práctico en 2026 es una base clásica más soporte de bloques específico donde realmente se necesite.
⁉️🤔 Preguntas frecuentes
¿Es obligatorio crear los 13 archivos para un tema?
No, el tema mínimo funcional es
index.php+style.css. Pero para un sitio con todas las funciones es mejor mantener el conjunto completo: cada archivo le da a WordPress la capacidad de elegir la plantilla óptima. Por ejemplo, sinsingle.phpuna entrada se renderizará a través deindex.phpy perderá el bloque de comentarios.
¿Cuál es la diferencia entre get_bloginfo() y bloginfo()?
bloginfo() envía el valor inmediatamente a la pantalla (echo). get_bloginfo() devuelve una cadena a una variable, usted puede procesarla, concatenarla o usarla dentro de otra expresión antes de la salida real.
¿Dónde coloco el Loop si la página tiene múltiples tipos de contenido?
El Loop puede lanzarse varias veces. Escenario típico: un Loop para la lista de entradas principal, un segundo para un widget de «últimas noticias» en la barra lateral. Antes del segundo Loop restablezca el puntero mediante wp_reset_postdata(), de lo contrario el siguiente código en la página obtendrá el contexto de entrada equivocado.
¿Funciona esta hoja de referencia para temas de bloques (FSE)?
Parcialmente. Los temas de bloques (Full Site Editing) usan
theme.jsonen lugar defunctions.phppara muchos ajustes y plantillas en HTML en vez de PHP. Pero el Loop,bloginfo()y las etiquetas de inclusión siguen siendo relevantes para temas híbridos y cualquier plantilla PHP dentro de temas FSE.
¿Qué hacer si functions.php se vuelve demasiado grande?
Divida la lógica en archivos separados e inclúyalos desde
functions.phpmedianterequire_onceoinclude. Por ejemplo:require_once get_template_directory() . '/inc/custom-post-types.php';. Esto mejora la legibilidad y simplifica el mantenimiento, una práctica recomendada para cualquier tema con más de 20-30 hooks.
¿Cuál es la diferencia entre una acción y un filtro?
Una acción realiza un efecto secundario y no devuelve nada (encolar un script, enviar un correo). Un filtro recibe un valor, lo modifica y debe devolverlo; un
returnolvidado en un filtro dejará el contenido en blanco. Se registran de forma idéntica:add_action()yadd_filter().
¿Por qué is_single() no funciona en functions.php?
Las etiquetas condicionales de consulta solo están disponibles después de que se forme la consulta principal, es decir, en archivos de plantilla o a partir del hook
template_redirect. Al inicio defunctions.phpla consulta aún no está lista, por lo que WordPress emitirá_doing_it_wrong(). Solois_admin()eis_user_logged_in()funcionan sin dependencia de consulta.
Qué tener a mano al desarrollar en WordPress
Esta hoja de referencia es el marco desde el cual comienza el desarrollo en WordPress. Los archivos del tema y la jerarquía de plantillas, el Loop, las etiquetas de inclusión y bloginfo() ensamblan el tema, mientras que los hooks y filtros, las etiquetas condicionales, el encolado de scripts, los shortcodes, WP_Query, el escapado, la API REST y WP-CLI cubren la gran mayoría de las tareas rutinarias. El resto es práctica y documentación.
Para un estudio en profundidad, el manual de desarrollo de temas en developer.wordpress.org es la primera referencia. La referencia de etiquetas de plantilla con cientos de funciones para todas las ocasiones también está allí. Si usted va de una maquetación HTML a un tema terminado, comience con la guía paso a paso para crear un tema de WordPress desde HTML, donde el Loop y las etiquetas se explican en contexto real, desde la maquetación hasta el tema funcional.
Marque esta hoja de referencia y téngala a mano durante el desarrollo.
¿Qué etiqueta o hook consulta usted con más frecuencia? Escriba en los comentarios qué tarea de WordPress encontró y comparta su caso de uso; el intercambio de experiencia en vivo vale más que una docena de guías oficiales.



