Spanish (Español) translation by Elías Nicolás (you can also view the original English article)
WordPress es la plataforma de blogs más grande disponible hoy en Internet; y con el lanzamiento oficial de la versión tres a la vuelta de la esquina, solo se hará más grande. Como tal, a lo largo de los próximos tuts autónomos, vamos a aprender los pormenores del desarrollo de complementos de WordPress, comenzando con la creación de nuestro primer plugin simple, "Optimización simple".
Paso 0: antes de comenzar
Este tutorial supondrá que tienes al menos la comprensión de un principiante de PHP y la sintaxis de WordPress. Aunque cubriremos todo, algunos conocimientos previos te ayudarán a comprender los conceptos mucho más fácilmente. También supondré que tienes una configuración de blog de WP y listo para funcionar.
Paso 1: Lo que hace nuestro complemento
El primer paso, al escribir un plugin de WP, es determinar todo lo que desea que haga. Dado que este es nuestro primer complemento, no haremos nada demasiado drástico. Vamos a crear algo que acelerará nuestro blog; nuestras páginas se procesarán más rápido, y también haremos un poco de SEO para mejorar nuestro rango de búsqueda y capacidad de búsqueda.
"¡Siempre crea una lista de lo que quieres que tu plugin realmente haga antes de escribir cualquier código!"
Eliminar metaetiquetas inútiles:
- "rsd_link" - Enlace de descubrimiento realmente simple
- "wlwmanifest_link" - Enlace de Windows Live Writer
- "wp_generator" - número de versión de WordPress
Eliminar filtros innecesarios:
- "wptexturize" - Citas directas
- "wp_filter_kses" - HTML en los perfiles de usuario
SEO:
- Insertar etiquetas de publicación en <head> como palabras clave
- Inserte el extracto del mensaje en <head> como descripción
Paso 2: Colocando la base
Para comenzar, vaya a su carpeta de complementos ("/wp-content/plugins/"), y cree una nueva carpeta. Llamaremos al nuestro "simple-optimización". A continuación, dentro de esta carpeta, vamos a necesitar crear dos archivos. El primero será el archivo de complemento real (llamado "main.php"), y el segundo será el archivo README obligatorio ("readme.txt"). Vamos a dejar el archivo readme.txt vacío por el momento; así que abre main.php en tu editor de texto preferido y copia en el siguiente código
<?php /* Plugin Name: Name Of The Plugin Plugin URI: https://URI_Of_Page_Describing_Plugin_and_Updates Description: A brief description of the Plugin. Version: The Plugin's Version Number, e.g.: 1.0 Author: Name Of The Plugin Author Author URI: http://URI_Of_The_Plugin_Author License: A "Slug" license name e.g. GPL2 . Any other notes about the plugin go here . */ ?>
Este texto es el mínimo necesario para que un complemento aparezca en el directorio de plugins de WordPress. Obviamente tendrá que llenar cada parte como mejor le parezca.
Paso 3: Agregar funciones
Las dos primeras características que vamos a implementar también serán las más simples. De forma predeterminada, WordPress agrega varias metaetiquetas a la sección <head> de su blog, pero el hecho simple es que estas metaetiquetas no tienen absolutamente ningún valor; así que simplemente vamos a detener que WordPress los agregue. Cada vez que WordPress realiza una acción, se llama filter o action, y podemos eliminar o manipular estos filtros y acciones (aquí puede encontrar una lista de todos los filtros y todas las acciones aquí). En este caso, queremos eliminar las diversas acciones que agregan esas meta-etiquetas.
Para hacerlo, usamos una función muy simple llamada "remove_action('action','function')". Esta función eliminará la función declarada en el segundo parámetro de la acción, el primer parámetro.
// Clean up wp_head // Remove Really simple discovery link remove_action('wp_head', 'rsd_link'); // Remove Windows Live Writer link remove_action('wp_head', 'wlwmanifest_link'); // Remove the version number remove_action('wp_head', 'wp_generator');
El mismo principio exacto se aplica a los dos filtros que vamos a eliminar:
// Remove curly quotes remove_filter('the_content', 'wptexturize'); remove_filter('comment_text', 'wptexturize'); // Allow HTML in user profiles remove_filter('pre_user_description', 'wp_filter_kses');
Paso 4: SEO
Ahora que hemos eliminado ese infierno, asegurémonos de que nuestro blog tenga un SEO básico; es decir, asegurémonos de tener palabras clave por página, que corresponden a esa página y cambiar la descripción para que coincida más con el artículo. Para nuestras palabras clave, vamos a tomar las etiquetas de la página / publicación actual. Esto se hace super simple por la función "wp_get_post_tags()". wp_get_post_tags devolverá una matriz de etiquetas de la publicación actual. A continuación, podemos formatear fácilmente esta matriz en una cadena y colocarla dentro de nuestro encabezado (dentro de la función "wp_head()", que cada tema debería tener ya) al adjuntar nuestra función a la acción wp_head.
Comencemos creando una nueva función, tags_to_keywords(), y, dentro de esta función, escribiremos una declaración if simple, que verifica si la página actual es una sola publicación o página (usando las funciones de WP: is_single() y is_page()). A continuación, crearemos una variable dentro de esta declaración if, denominada $tags, y estableceremos su contenido en la función wp_get_post_tags(); sin embargo, para que esta función funcione, necesitamos pasar un parámetro de "post_id". La manera más sencilla de obtener eso es globalizando la variable $post de WP que contiene la identificación de la publicación ($post->ID, $post es un objeto y por eso estamos llamando a sus valores de esa manera).
// SEO // add tags as keywords function tags_to_keywords(){ global $post; if(is_single() || is_page()){ $tags = wp_get_post_tags($post->ID); } }
A continuación, usaremos un foreach para filtrar los datos de $ etiquetas y crear una nueva matriz con solo la información que queremos ($tag_array). A continuación, implosionaremos la matriz en una cadena y separaremos cada elemento de la matriz con una coma y espacio ($tag_string). Luego, crearemos otra instrucción if que compruebe si $tag_string tiene un valor (es decir, si tenemos etiquetas para la publicación) y, si lo hace, repita el último HTML.
function tags_to_keywords(){ global $post; if(is_single() || is_page()){ $tags = wp_get_post_tags($post->ID); foreach($tags as $tag){ $tag_array[] = $tag->name; } $tag_string = implode(', ',$tag_array); if($tag_string !== ''){ echo "<meta name='keywords' content='".$tag_string."' />\r\n"; } } }
Lo último que tenemos que hacer ahora es adjuntar nuestra nueva función con la acción wp_head. Para hacer esto, vamos a llamar a add_action('action','function'), y pasarle los parámetros "wp_head" y "tags_to_keywords" (en ese orden).
add_action('wp_head','tags_to_keywords');
Para aumentar aún más nuestro SEO, vamos a agregar nuestros metadatos de descripción al encabezado también, utilizando el mismo método que las palabras clave. Una vez que tengamos la declaración if reescrita, vamos a crear una nueva variable $all_post_content y llenarla usando la función WP wp_get_single_post() (y pasar el parámetro de $post->ID). Esto nos dará un objeto lleno de todos los datos sobre nuestra publicación. Con esta variable, podemos crear una descripción usando el contenido real de la publicación, pero vamos a acortarla a un centenar de caracteres utilizando la función substr($excerpt). Y luego, haremos eco del HTML con el extracto escrito. (Opcionalmente, también puede agregar una declaración else y hacer eco de la descripción de su blog usando la función get_bloginfo('description').)
// add except as description function excerpt_to_description(){ global $post; if(is_single() || is_page()){ $all_post_content = wp_get_single_post($post->ID); $excerpt = substr($all_post_content->post_content, 0, 100).' [...]'; echo "<meta name='description' content='".$excerpt."' />\r\n"; } else{ echo "<meta name='description' content='".get_bloginfo('description')."' />\r\n"; } } add_action('wp_head','excerpt_to_description');
Paso 5: Optimizar la base de datos
La característica final de nuestro complemento es optimizar nuestras tablas de base de datos al eliminar la sobrecarga (datos inútiles / en exceso en una tabla SQL creada al manipular la base de datos). Para comenzar, crearemos una nueva función (optimize_database), y dentro de ella, llamaremos a la variable global WPDB ($wpdb). De esta forma, podemos interactuar con la base de datos, sin tener que volver a ingresar nuestros detalles de autenticación. $wpdb tiene varios métodos que puede usar para interactuar y recuperar información de la base de datos (lista completa aquí), pero solo vamos a usar uno, get_results. El uso de get_results con los parámetros de "SHOW TABLES" y "ARRAY_A" nos devolverá una matriz asociativa de todos los nombres de tabla en la base de datos. En ese punto, podemos usar un foreach para recorrer cada uno de los valores de la matriz (usando array_values para obtener el nombre de la tabla, debido a la forma en que la función está en capas) y usar otro método $wpdb, query para ejecutar el comando optimize ("OPTIMIZE TABLE _____").
//Optimize Database function optimize_database(){ global $wpdb; $all_tables = $wpdb->get_results('SHOW TABLES',ARRAY_A); foreach ($all_tables as $tables){ $table = array_values($tables); $wpdb->query("OPTIMIZE TABLE ".$table[0]); } }
Si bien esta función funciona, en realidad nunca se ejecutará porque WordPress no tiene forma de saber cómo ejecutarla. Afortunadamente, WordPress tiene una función llamada cron, que programa las funciones para que se ejecuten a intervalos específicos (diario, semanal, etc.); esto es perfecto para nosotros, ya que deseamos optimizar con frecuencia nuestra base de datos. Para usar Cron, vamos a crear una nueva función (simple_optimization_cron_on) y llenarla con otra función llamada a wp_schedule_event(). Para funcionar, wp_schedule_event necesita tres cosas: un tiempo para ejecutar, un intervalo entre cada ejecución y una función para llamar; así que le pasaremos los parámetros: 'time ()' (supondremos que cada vez que se crea el evento cron es un buen momento para llamar a la función), 'daily', 'optimize_database' en ese orden.
function simple_optimization_cron_on(){ wp_schedule_event(time(), 'daily', 'optimize_database'); }
Genial, ahora tenemos nuestra función optimize_database añadida a la lista cron de WP, o lo haríamos si tuviéramos que llamar a la función simple_optimization_cron_on. Es realmente inseguro y es una mala práctica llamar a sus propias funciones de adición de eventos, porque a través de un sistema arbitrario de eventos, podría causar que la función sea llamada varias veces. WordPress tiene un conjunto de ganchos específicos para complementos para resolver este problema: register_activation_hook y register_deactivation_hook. Estas funciones se invocan cuando un complemento está activado (activado) y apagado (desactivado). De esta forma, nuestra función cron solo se puede agregar una vez. Ahora, tenemos la capacidad de eliminar el evento cron si el complemento deja de usarse. Para trabajar, estas funciones necesitan dos elementos de información: la url del archivo que tiene las funciones de activación y desactivación (el 99% de las veces "__FILE__" funcionará perfectamente aquí), y el nombre de la función de activación y desactivación. También crearemos una nueva función (simple_optimization_cron_off) y la completaremos con una llamada a otra función (wp_clear_scheduled_hook('optimize_database')) para eliminar nuestro evento cron.
function simple_optimization_cron_off(){ wp_clear_scheduled_hook('optimize_database'); } register_activation_hook(__FILE__,'simple_optimization_cron_on'); register_deactivation_hook(__FILE__,'simple_optimization_cron_off');
Paso 6: Completar el archivo Léame
Lo último que tenemos que hacer para nuestro nuevo complemento es completar el archivo readme.txt. El archivo de WordPress Plugin utiliza el archivo readme.txt para mostrar toda la información que le proporciona sobre su complemento. La mejor manera de aprender cómo escribir un archivo efectivo readme.txt es descargar el valor predeterminado de WP, y modificarlo en consecuencia para adaptarse a su complemento. Como la nuestra era tan simplista, esto es con lo que terminé personalmente:
=== Simple Optimization === Contributors: Jonathan Wolfe Plugin link: http://net.tutsplus.com/ Tags: simple, optimization, keywords, tags, description, SEO, optimize, database Requires at least: 2.5.1 Tested up to: 2.9.2 Stable tag: trunk Silently adds several optimizing functions to the WordPress back-end to make your blog or site run faster. == Description == Simple Optimization adds several functions to WordPress that help trim the fat from the system and also clean up after itself a little bit all leading to a faster loading time for your blog or website. **Features** _Remove useless meta tags:_ * "rsd_link" - Really Simple Discovery Link * "wlwmanifest_link" - Windows Live Writer link * "wp_generator" - WordPress version number _Remove useless filters:_ * "wptexturize" - currly quotes * "wp_filter_kses" - HTML in user profiles _SEO:_ * Insert post tags into <head> as keywords _Routinely optimize the database_ == Installation == 1. Download, unzip and upload to your WordPress plugins directory 2. activate the plugin within you WordPress Administration
¡Eso es!
Acaba de escribir con éxito su primer plugin de WordPress, que está funcionando y listo para el Directorio de complementos de WP. En el camino, aprendió sobre filtros y acciones, utilizando objetos globales de WP, mucho sobre la nomenclatura de WordPress, cómo interactuar con la base de datos, eventos cron y ganchos de activación / desactivación. Si tiene alguna pregunta, por favor deje un comentario y responderé tan pronto como pueda.
El código final:
<?php /* Plugin Name: Simple Optimization Plugin URI: http://net.tutsplus.com Description: A super-simple plugin to improve your blog Version: 1.0 Author: Jonathan Wolfe Author URI: http://fire-studios.com License: GPL2 . This plugin written for NETTUTS at http://net.tutsplus.com . */ // Clean up wp_head // Remove Really simple discovery link remove_action('wp_head', 'rsd_link'); // Remove Windows Live Writer link remove_action('wp_head', 'wlwmanifest_link'); // Remove the version number remove_action('wp_head', 'wp_generator'); // Remove curly quotes remove_filter('the_content', 'wptexturize'); remove_filter('comment_text', 'wptexturize'); // Allow HTML in user profiles remove_filter('pre_user_description', 'wp_filter_kses'); // SEO // add tags as keywords function tags_to_keywords(){ global $post; // Get access to the $post object if(is_single() || is_page()){ // only run on posts or pages $tags = wp_get_post_tags($post->ID); // get post tags foreach($tags as $tag){ // loop through each tag $tag_array[] = $tag->name; // create new array with only tag names } $tag_string = implode(', ',$tag_array); // convert array into comma seperated string if($tag_string !== ''){ // it we have tags echo "<meta name='keywords' content='".$tag_string."' />\r\n"; // add meta tag to <head> } } } add_action('wp_head','tags_to_keywords'); // Add tags_to_keywords to wp_head function // add except as description function excerpt_to_description(){ global $post; // get access to the $post object if(is_single() || is_page()){ // only run on posts or pages $all_post_content = wp_get_single_post($post->ID); // get all content from the post/page $excerpt = substr($all_post_content->post_content, 0, 100).' [...]'; // get first 100 characters and append "[...]" to the end echo "<meta name='description' content='".$excerpt."' />\r\n"; // add meta tag to <head> } else{ // only run if not a post or page echo "<meta name='description' content='".get_bloginfo('description')."' />\r\n"; // add meta tag to <head> } } add_action('wp_head','excerpt_to_description'); // add excerpt_to_description to wp_head function //Optimize Database function optimize_database(){ global $wpdb; // get access to $wpdb object $all_tables = $wpdb->get_results('SHOW TABLES',ARRAY_A); // get all table names foreach ($all_tables as $tables){ // loop through every table name $table = array_values($tables); // get table name out of array $wpdb->query("OPTIMIZE TABLE ".$table[0]); // run the optimize SQL command on the table } } function simple_optimization_cron_on(){ wp_schedule_event(time(), 'daily', 'optimize_database'); // rdd optimize_database to wp cron events } function simple_optimization_cron_off(){ wp_clear_scheduled_hook('optimize_database'); // remove optimize_database from wp cron events } register_activation_hook(__FILE__,'simple_optimization_cron_on'); // run simple_optimization_cron_on at plugin activation register_deactivation_hook(__FILE__,'simple_optimization_cron_off'); // run simple_optimization_cron_off at plugin deactivation ?>