WordPress.org API - Obtener los plugins favoritos de los autores

17 may 2012, 20:44:18
Vistas: 984
Votos: 7

Recientemente se han añadido algunas novedades al repositorio de plugins de WordPress.org. Lo más destacado son los cambios en la página de plugins y el perfil de autor, que ahora muestra los plugins favoritos de los autores.

Quiero crear un widget para la barra lateral que muestre los plugins favoritos de un autor. Sé cómo usar la API para obtener estadísticas de plugins y también he leído la documentación de la API de DD32, pero no creo que exista documentación sobre perfiles o si incluso existe una API para perfiles.

Intenté usar wp_remote_get y puedo obtener el HTML de la página de perfil, pero no he intentado analizarlo todavía porque parece un método demasiado complicado. Sería genial si pudiera obtener el perfil en XML o JSON.

¿Existen métodos que me esté perdiendo o existe una API de perfiles?

Edición:

Ok, tengo una versión beta en GitHub usando el analizador SimpleHTML Dom. No creo que pueda obtener las valoraciones con estrellas, pero estoy bastante satisfecho con los resultados como primer intento sin una API.

WordPress.org no permite el scraping de contenido y puede banear tu acceso (vía @otto). Así que esto no es viable hasta que se lance una API pública.

4
Comentarios

Como solución temporal hasta que Otto implemente la API de perfil, usa SimpleHTMLDom Parser para extraer el contenido que necesitas. Si puedes obtener la URL del perfil del autor de manera programática, entonces estás listo. Cambia a llamadas API oficiales cuando esté listo. http://simplehtmldom.sourceforge.net/ & http://simplehtmldom.sourceforge.net/manual.htm

Adam Adam
17 may 2012 22:20:24

Excelente idea. Ya puedo formar las URLs y obtener el HTML de salida de la página.

Chris_O Chris_O
17 may 2012 22:28:35

Puedes obtener la calificación de estrellas copiando las propiedades CSS para los selectores div.star-holder .star-rating y sirviéndolas desde la hoja de estilos del plugin. Asegúrate de copiar también la imagen de fondo de la calificación de estrellas. Luego, cuando extraigas el elemento <div class="star-rating" style="width:??px"></div>, tu propiedad CSS mostrará las estrellas (cualquiera que sea su calificación) ya que está controlado por el ancho del div. Pan comido.

Adam Adam
18 may 2012 14:49:03

Además, para diferenciar las estrellas, simplemente cambia su color en Photoshop para que no sea una copia directa del azul de WordPress o, alternativamente, si quieres ser más ingenioso, crea una serie de variaciones de color que tus usuarios puedan elegir para que se ajusten a la estética de su sitio. Utilizo mucho SimpleHTMLDom Parser en casos donde no existe una API, ni digamos un feed RSS (si ese es mi objetivo). Es tan efectivo como la solución real, siempre y cuando si algo cambia necesitarás actualizar tu código para reflejarlo. Pero en ausencia de acceso real a una API, puede brindarte acceso al contenido.

Adam Adam
18 may 2012 14:52:32
Todas las respuestas a la pregunta 2
1

Todavía no.

Otto dijo "pronto" el miércoles. Pero se fue a una parrillada este fin de semana, así que "pronto" probablemente signifique "este mes". ;)

Edición:

Otto42: @Ipstenu @EricMann Tengo código para hacer eso, pero aún no está implementado. Hay debate sobre la mejor manera. Estará allí eventualmente.

17 may 2012 20:50:39
Comentarios

Entendido... la parrillada siempre supera a WordPress.

Chris_O Chris_O
17 may 2012 20:52:03
0

Los plugins favoritos se han añadido a la API de WordPress.org. Hay una nueva característica en la versión 3.5 que te permite acceder a tus favoritos desde el instalador de plugins.

Consulta http://core.trac.wordpress.org/ticket/22002 para obtener información sobre cómo se está utilizando en el núcleo.

La API te permite recuperar un objeto que contiene cada plugin

  • nombre
  • descripción
  • autor
  • valoración
  • fecha de última actualización
  • registro de cambios
  • versión estable
  • compatible con la versión de WP

Para recuperar el objeto

Realiza una llamada a http://api.wordpress.org/plugins/info/1.0/ usando wp_remote_post pasando un array de argumentos que incluyan la acción que sería 'query_plugins' y el nombre de usuario de WordPress.org para recuperar los favoritos.

$request = wp_remote_post('http://api.wordpress.org/plugins/info/1.0/', array( 'timeout' => 15, 'body' => array('action' => $action, 'request' => serialize($args))) );

Antes de obtener un objeto limpio y ordenado, necesitas manejar errores y hacer algún análisis. Aquí hay una función de ejemplo que devolverá un objeto limpio con todos los detalles del plugin.

function api( $action, $args ) {
        if ( is_array( $args ) )
            $args = (object) $args;

        $request = wp_remote_post('http://api.wordpress.org/plugins/info/1.0/', array( 'timeout' => 15, 'body' => array('action' => $action, 'request' => serialize($args))) );
        if ( is_wp_error($request) ) {
            $res = new WP_Error('plugins_api_failed', __( 'Ocurrió un error inesperado. Puede que haya un problema con WordPress.org o con la configuración de este servidor. Si continúas teniendo problemas, por favor prueba los <a href="http://wordpress.org/support/">foros de soporte</a>.' ), $request->get_error_message() );
        } else {
            $res = maybe_unserialize( wp_remote_retrieve_body( $request ) );
            if ( ! is_object( $res ) && ! is_array( $res ) )
                $res = new WP_Error('plugins_api_failed', __( 'Ocurrió un error inesperado. Puede que haya un problema con WordPress.org o con la configuración de este servidor. Si continúas teniendo problemas, por favor prueba los <a href="http://wordpress.org/support/">foros de soporte</a>.' ), wp_remote_retrieve_body( $request ) );
        }

        return apply_filters( 'c3m_favorite_results', $res, $action, $args );
    }

Uso

Este ejemplo de uso te dará una lista desordenada de plugins favoritos junto con un enlace al plugin en WordPress.org, un enlace al URI del autor y la valoración en estrellas.

$api_data = api( 'query_plugins', array( 'user' => 'mi_usuario_de_wordpress' ) );
$api_plugins = $api_data->plugins;

echo '<ul class="c3m-favorites">';
        foreach( $api_plugins as $plugin ) {

            $name = $plugin->name; ?>
            <li><strong><a target="_blank" href="http://wordpress.org/extend/plugins/<?php echo $plugin->slug ?>/"><?php echo esc_html( $name ); ?></a></strong><br>

                <div class="star-holder" title="<?php printf( _n( '(basado en %s valoración)', '(basado en %s valoraciones)', $plugin->num_ratings ), number_format_i18n( $plugin->num_ratings ) ); ?>">
                <div class="star star-rating" style="width: <?php echo esc_attr( str_replace( ',', '.', $plugin->rating ) ); ?>px"></div></div>

                <em><?php _e('Por: ') ?></em> <?php echo links_add_target( $plugin->author, '_blank' ). '<br>'; ?>
            </li><?php
        }
        echo '</ul>';

Resultado

Captura de pantalla de ejemplo de plugins favoritos

Captura de pantalla del widget de mi plugin Favorite Plugins Widget: http://wordpress.org/extend/plugins/favorite-plugins-widget/

30 sept 2012 00:33:15