Como mostrar e instalar temas de un desarrollador específico en WordPress

Temas de desarrollador en WordPress

Una de las grandes ventajas de usar software open source es que tenemos acceso a todo el conocimiento ahí mismo en nuestra IDE. El Codex y similares obviamente son geniales y ayudan un montón, pero con paciencia y método, todas las respuestas las podemos encontrar en el mismo código de WordPress.

Un usuario de nuestro grupo hizo una pregunta bastante particular:

Necesito de alguna forma lograr que en el instalador de temas de wordpress solo me muestre los temas que desarrollo un usuario en especifico (desarrollador de temas en wordpress.org).. y que solo se muestren y puedan instalar temas de ese usuario únicamente..

Al leer la pregunta inmediatamente decidí que iba a escribir este post.

No porque la pregunta me parezca especialmente relevante ya que es un caso de uso bastante único, y de hecho espero que Franz no use esta solución con fines malignos =)

Pero es un excelente ejemplo de lo que quiero intentar enseñarles hoy. A continuación voy a describir paso a paso cómo hice para encontrar la respuesta a lo que Franz necesita resolver. Obviamente esto es algo que jamas había tenido que resolver antes.

Como lo resolví, paso a paso

1) Abrí mi navegador y fui a la página que necesitamos modificar. Noté que la URL es wp-admin/theme-install.php

2) Navegué hasta ese archivo en mi editor y noté que los datos no se están llenando ahí, sino que es simplemente un template que luego un Javascript va a llenar con los resultados. Pueden ver ustedes mismos que el markup que encierra cada theme en el frontend, esta dentro de una etiqueta que luce algo asi:

<script id="tmpl-theme" type="text/template">
....
</script>
view raw theme-install.php hosted with ❤ by GitHub

3) Ahora que sé que la información que queremos filtrar viene por AJAX, necesito encontrar donde está el código PHP que “atiende” esa llamada. Hay varias formas, pero les sugiero las más rápida. Volví al navegador y usando las DevTools inspeccioné ese request AJAX para ver que información contiene:

Dos datos importantes acá. Uno es que el llamado AJAX se hizo a admin-ajax.php y dos, que la “action” es query-themes.

4) Abro wp-admin/admin-ajax.php, y abajo de todo veo como WordPress registra y ejecuta todas sus acciones AJAX. En resumen, registra acciones así

add_action( 'wp_ajax_' . $_GET['action'], 'wp_ajax_' . str_replace( '-', '_', $_GET['action'] ), 1 );

y luego las ejecuta así:

do_action( 'wp_ajax_' . $_REQUEST['action'] );

Si te parece chino básico, leé esto. Pero si entendés lo que está pasando es fácil ver que se está ejecutando una acción llamada wp_ajax_query-themesy WordPress está agregando una función que debe ejecutarse en ese hook llamada wp_ajax_query_themes()

5) Busco la función wp_ajax_query_themes() en el código y la encuentro en wp-admin/includes/ajax-actions.php. Inspeccionando la función vemos que la información que necesitamos modificar viene de la función themes_api(). La busco y la encuentro en wp-admin/includes/theme.php. 

6) Mirando dentro de themes_api() encuentro un filtro prometedor. themes_api_args me permite modificar los argumentos de todas las llamadas al API de WordPress.org donde se consultan los temas del catálogo. Veo que la variable que es filtrada se llama $args y me gustaría saber exactamente qué contiene así la puedo modificar. Lo idea para eso es usar xDebug pero eso excede el alcance de este post, así que vamos con un hack que puede serles útil. Agrego en el functions.php de mi tema una función a ese filtro, y en ella hago un print_r() de $args.

<?php
add_filter( 'themes_api_args', 'wpe_ejemplo_api_themes' );
function wpe_ejemplo_api_themes( $args ) {
print_r( $args );
die();
}
view raw print_r.php hosted with ❤ by GitHub

Como esto se ejecuta via AJAX no puedo ver en el navegador el resultado, pero puedo usar el mismo truco que use arriba interceptando la llamada AJAX via DevTools:

 

Buenísimo, ya sabemos que $args es un objeto stdClass (y no un array, atención!)

7) Busco la documentación de la API y me fijo si hay un parámetro para filtrar por autor. Si no lo hubiera, estaríamos en problemas! (Dejo como ejercicio al lector descubrir una forma de obtener el objetivo final si esta API no tuviera esa opción. Se puede realizar de una forma muy similar a lo que estamos haciendo acá). Por suerte vemos que hay un parámetro opcional llamado author.

8) Modifico la función que agregué a mi functions.php para agregar el argumento del autor que quiero filtrar, y voilà! Terminamos. Logramos lo que queríamos solo consultando el código delante nuestro (y un poquito el Codex, para la API).

<?php
add_filter( 'themes_api_args', 'wpe_ejemplo_api_themes' );
function wpe_ejemplo_api_themes( $args ) {
$args->author = 'wordpressdotorg';
return $args;
}
view raw functions.php hosted with ❤ by GitHub

Por favor, comenten si tienen dudas o si quieren compartir sus tips y técnicas para resolver problemas. También por favor déjenme saber si les gusta esta clase de tutoriales apuntados más a técnicas que a soluciones concretas. Si esto tiene éxito y les gusta, por ahí puedo elegir una pregunta por mes en el grupo y hacer un video mostrándoles no solo la solución sino como llegar a ella ustedes mismos.

5 thoughts on “Como mostrar e instalar temas de un desarrollador específico en WordPress”

  1. Buenísimo Daniel. Acá abordas varios temas importantes, como por ejemplo el uso de Ajax en WordPress utilizando su API. Recuerdo (hace ya mucho tiempo) la cara que se me quedó cuando supe que WordPress me facilitaba tanto el trabajo con Ajax. Las posibilidades son infinitas y esta implementación que propones me parece muy completa.

    Gracias.

  2. Muchas Gracias Daniel Dvorkin!!!
    Eres un DIOS!!!…
    Que nostalgia ver que solo 5 lineas de codigo hacen la magia.. pero cuanto conocimiento tuyo..
    Te admiro, me haz ayudado desde mucho tiempo atrás..
    Espero algún día tener todo ese conocimiento…
    Muchas gracias!!!

  3. Muy buena explicación y muy comprensible, haber si me podrías ayudar con algo que estuve intentando realizar el cual es cuando creo un theme vi que muchos llegan a eliminar un plugin necesario y lo que sucede es el colapso del sitio, por ello lo que estuve intentando es que al activar el theme me salga los plugins requeridos y su enlace para la descarga desde el repositorio o desde el theme que tendrá activo en ese instante.

    Encontré muchas referencias en github https://goo.gl/hxIRLV pero al añadir no sale nada, talvez este realizando algo incorrecto o sera la version del wordpress ya que estoy usando la 4.7.2, espero que me puedas ayudar con este problema que estuve intentando muchas veces. muchas gracias de antemano

    1. Hola Alejandro, la opción de TGM es la correcta. Solo tienes que asegurarte de que el plugin esté TGM esté debidamente incluido en el código de tu theme, para que funcione. Lo otro es que las referencias a los plugins deben ser exactas, con el slug y nombre exactos.

      Te dejo referencia al código exacto de lo que necesitas. Por supuesto, debes cambiar los datos a los plugins que tu quieras “forzar”.

      https://gist.github.com/deryckoe/52d3c5cbea239bb2b9a6f3d9a32860b4

Deja un comentario