Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrollo de Plugins
Desarrollo de Plugins
- Desarrollo de Plugins
Archivos del plugin, Hooks, Shortcodes, Página de opciones del plugin, objeto
$wpdb, Actualización del plugin.
dariobf.com
#1
¿Qué es un plugin?
¿Y cómo crearlo?
¿Qué es un plugin?
Un plugin es un conjunto de ficheros cuyo fin es añadir funciones
extra a WordPress.
Un plugin:
• Requiere una cabecera específica, única con información del plugin.
• Se guarda en wp-content/plugins (Normalmente en subdirectorio.
• Se ejecuta sólo cuando está activado, a través del panel de plugins
• Aplica sus funciones a todos los temas.
• Debe tener un propósito; por ejemplo: convertir artículos en páginas,
ofrecer mejoras de posicionamiento o ayudar con los backups.
dariobf.com
¿Cómo es un plugin?
index.php
dariobf.com
Cabecera del plugin
• Plugin name.
• Plugin URI.
• Description.
• Author.
• Author URI.
• Version.
• Domain Path.
• Network.
• Text domain.
dariobf.com
Cabecera del plugin
<?php
/**
* Plugin Name: Name of the plugin, must be unique.
* Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
* Description: A brief description of the plugin.
* Version: The plugin's version number. Example: 1.0.0
* Author: Name of the plugin author
* Author URI: http://URI_Of_The_Plugin_Author
* Text Domain: Optional. Plugin's text domain for localization.
Example: mytextdomain
* Domain Path: Optional. Plugin's relative directory path
to .mo files. Example: /locale/
* Network: Optional. Whether the plugin can only be activated
network wide. Example: true
* License: A short license name. Example: GPL2
*/
dariobf.com
#2
Los Hooks
Ganchos
¿Qué son los ganchos?
dariobf.com
¿Qué son los ganchos?
dariobf.com
¿Qué son los ganchos?
dariobf.com
¿Qué son los ganchos?
dariobf.com
No le tengas miedo a
los hooks
dariobf.com
¿Cómo funcionan?
La llamada al
servidor inicia el
» »
index.php, que Vuelve a
ejecuta código del ejecutar el
core. código del
El código del core El Hook se core.
invoca al método ejecuta
do_action().
dariobf.com
Ejemplo de Hook
<?php
add_filter(‘the_content’, ‘my_function’);
function my_function($content) {
return $content . ‘<p>¡Compártelo con un amigo!</p>’;
}
?>
dariobf.com
Cuidadín
Tu función se integrará con el core de WordPress.
Hay que tener cuidado con los nombres que utilizamos.
Aquí te dejo algunos nombres reservados.
• start_process()
• output()
• modify_content()
• pluginname_process()
• pluginname_output()
• pluginname_modify_content()
dariobf.com
Naming de funciones
<?php
add_filter(‘the_content’, ‘_trackableshare_process’);
function _trackableshare_process($content) {
/* whatever */
}
?>
dariobf.com
Ejemplo de plugin OOP
<?php
class trackable_social_share{
public function __construct() {
// Add Hooks
add_filter('the_content', array($this, 'process'));
}
public function process($content) {
/* ... */
}
}
$trackable_social_share = new trackable_social_share();
?>
dariobf.com
Resumen
• Un Hook es un evento que llama a una función o método en
una acción.
• Tu código es integrado en el core de WordPress
dinámicamente, pasando a ser parte de él.
• Nos referimos con frecuencia a los hooks como “Action hooks”
y “Filter hooks”
• Puedes utilizar tanto código tradicional como Orientado a
Objetos con hooks.
• Recuerda que el naming de las funciones es clave.
dariobf.com
#3
dariobf.com
Ejemplo de manipulación de
contenido
<?php
add_filter('the_content', ‘guorpres_vs_wordpress’);
function guorpres_vs_wordpress($content) {
return str_replace('wordpress', 'WordPress', $content);
}
?>
dariobf.com
Consejo: Filter Hooks
No utilices Filter Hooks para el uso de shortcodes.
<?php
add_shortcode('pirate', 'ninja_function');
function ninja_function() {
return ‘ninja’;
}
?>
dariobf.com
Filter Hooks
Los filtros pueden ser utilizados múltiples veces y en múltiples tipos
de contenido.
Pueden modificar el contenido antes de guardarlo en la base de
datos, o más adelante; durante la fase de renderizado.
También puedes modificar el autor, comentarios, widgets, enlaces,
blogroll, fechas y horas, elementos del escritorio, etc, todo de forma
dinámica sin tener que modificar el código del núcleo de
WordPress.
https://codex.wordpress.org/Plugin_API/Filter_Reference
dariobf.com
Filtro pre-guardado
comentarios
<?php
add_filter('comment_status_pre ', 'pluginname_malwordpress');
function pluginname_malwordpress($content) {
$badwords = array('wordpress', 'Wordpress', 'güorpress',
'wordPress', 'hook');
return str_replace($badwords, 'WordPress', $content);
dariobf.com
Añadiendo Filter Hooks
Todos se añaden utilizando la función add_filter()
<?php
add_filter($tag, $function, [$priority],[$accepted_args]);
?>
Tag: (string) A qué tipo de proceso de contenido debe ser aplicado el filtro
Function: (callback) La función a ejecutar
Priority: (int) – opcional Orden en el que debe ser ejecutado. A número más
bajo antes se ejecutará. Por defecto 10.
Accepted Args: (int) – opcional Número de argumentos aceptados cuando
utilizamos apply_filters() (WP >= 1.5.1). Por defecto 1.
dariobf.com
Pregunta 1
<?php
add_filter('the_content', ‘regla_poni');
add_filter('the_content', ‘regla_caballo', 9);
add_filter('the_content', ‘regla_batman', 8);
function regla_poni($content) {
return str_replace(‘mi animalito', ‘Ponis!’, $content);
}
function regla_caballo($content) {
return str_replace(‘mi animalito', ‘Caballitos!', $content);
}
function regla_batman($content) {
return str_replace(‘mi animalito', ‘NANANA BATMAN!!’, $content);
}
?>
dariobf.com
Resultado
dariobf.com
Pregunta 2
<?php
add_filter('the_content', ‘regla_poni');
add_filter('the_content', ‘regla_caballo', 9);
add_filter('the_content', ‘regla_batman', 8);
function regla_poni($content) {
return ‘Ponis!’;
}
function regla_caballo($content) {
return ‘Caballitos!’;
}
function regla_batman($content) {
return ‘NANANA BATMAN!!’;
}
?>
dariobf.com
Resultado
dariobf.com
#4
dariobf.com
Action Hooks
dariobf.com
Action Hooks
dariobf.com
Ejemplo de Action Hook
<?php
add_action(‘admin_menu', ‘mi_plugin_extraordinario’);
function mi_plugin_extraordinario() {
if(function_exists('add_submenu_page')) {
add_submenu_page(‘plugins.php','Extraordinario',
‘Extraordinario’, 10, ‘my_new_plugin',
'my_new_plugin_admin_page_function');
}
}
?>
dariobf.com
Resultado
El Action: Obtiene el menú de administración.
La petición: Cuando estés generando el Menú de administración,
ejecuta esta función que añade un elemento bajo la sección de
plugins.
El Resultado: El menú es generado con nuestro enlace, justo
debajo de la sección de plugins.
dariobf.com
Añadiendo Action Hooks
Todos se añaden utilizando la función add_action()
<?php
add_action($tag, $function, [$priority],[$accepted_args]);
?>
Tag: (string) A qué tipo de proceso de contenido debe ser aplicado el filtro
Function: (callback) La función a ejecutar
Priority: (int) – opcional Orden en el que debe ser ejecutado. A número más
bajo antes se ejecutará. Por defecto 10.
Accepted Args: (int) – opcional Número de argumentos aceptados cuando
utilizamos apply_filters() (WP >= 1.5.1). Por defecto 1.
dariobf.com
Resumen
Filter Hooks Action Hooks
Modifican contenido. Añaden o eliminan código
Se crean con add_filter(). en una acción concreta.
Se crean con add_action().
dariobf.com
#5
Advanced Hooking
Advanced Hooking
dariobf.com
Funciones basadas en
un Action
has_action(‘hook’, ‘function’);
did_action(‘hook’);
remove_action(‘hook’, ’function’);
remove_all_actions(‘hook’);
dariobf.com
Funciones basadas en
un Filter
has_filter(‘hook’, ‘function’);
did_filter(‘hook’);
current_filter();
remove_filter(‘hook’, ’function’);
remove_all_filters(‘hook’);
dariobf.com
has_*
dariobf.com
did_*
dariobf.com
current_filter
La función current_filter() retorna si el evento actual ha sido
procesado. Por ejemplo, si el hook invocado es “the_content”, esta
función retornará “the_content”.
dariobf.com
remove_*
Es útil si quieres evitar que una función sea llamada cuando suceda
el evento.
dariobf.com
remove_all_*
Las funciones remove_all_actions() y remove_all_filters() eliminará
todas las funciones específica de un hook.
dariobf.com
Creando Hooks
personalizados
Podemos definir Hooks personalizados en nuestro plugin o tema
que pueden ser enganchados dentro de otros plugins utilizando la
función do_action() y apply_filters().
do_action(‘hook_name’);
apply_filters(‘hook_name’, $content);
dariobf.com
Ejemplo de Hook personalizado
<?php
function my_plugin_function() {
// Allow hooks into this function
do_action('my_plugin_init');
// Create Content
$content = 'Hello world';
// Allow Content to have filters ran against it
// Be sure to store the returned result of the FILTER!!!
$content = apply_filters('my_plugin_content', $content);
}
?>
dariobf.com
Resumen
dariobf.com
Utiliza el Codex
Hemos visto mucha información sobre los Hooks de WordPress,
pero hay mucha más disponible en el Codex, incluyendo los tipos
de parámetros que algunos Hooks enviarán a tus funciones cuando
el evento es invocado.
dariobf.com
#6
Shortcodes
Shortcodes
dariobf.com
Shortcode simple
[recent-posts]
<?php
function recent_posts_function() {
query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => 1));
if (have_posts()) :
while (have_posts()) : the_post();
$return_string = '<a href="'.get_permalink().'">'.get_the_title().'</a>';
endwhile;
endif;
wp_reset_query();
return $return_string;
}
function register_shortcodes(){
add_shortcode('recent-posts', 'recent_posts_function');
}
add_action( 'init', 'register_shortcodes');
?>
Shortcode avanzado
[recent-posts posts=“5”]
function recent_posts_function($atts){
extract(shortcode_atts(array(
'posts' => 1,
), $atts));
$return_string = '<ul>';
query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));
if (have_posts()) :
while (have_posts()) : the_post();
$return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</
a></li>';
endwhile;
endif;
$return_string .= '</ul>';
wp_reset_query();
return $return_string;
}
Shortcode avanzado 2
[recent-posts posts=“5”]Cabecera de los últimos posts[/shortcode]
function recent_posts_function($atts, $content = null) {
extract(shortcode_atts(array(
'posts' => 1,
), $atts));
$return_string = '<h3>'.$content.'</h3>';
$return_string .= '<ul>';
query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $posts));
if (have_posts()) :
while (have_posts()) : the_post();
$return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</
a></li>';
endwhile;
endif;
$return_string .= '</ul>';
wp_reset_query();
return $return_string;
}
Habilitar shortcodes
<?php
add_filter('widget_text', ‘do_shortcode');
add_filter( 'comment_text', 'do_shortcode' );
add_filter( 'the_excerpt', 'do_shortcode');
?>
dariobf.com
Shortcodes útiles
<?php
function linkbutton_function( $atts, $content = null ) {
return '<button type="button">'.do_shortcode($content).'</
button>';
}
add_shortcode('linkbutton', 'linkbutton_function');
?>
[linkbutton]¡Soy un botón![/linkbutton]
dariobf.com
function menu_function($atts, $content = null) {
extract(
shortcode_atts(
array( 'name' => null, ),
$atts
)
);
return wp_nav_menu(
array(
'menu' => $name,
'echo' => false
)
);
}
add_shortcode('menu', 'menu_function');?>
[menu name=“main-menu”]
function googlemap_function($atts, $content = null) {
extract(shortcode_atts(array(
"width" => '640',
"height" => '480',
"src" => ''
), $atts));
return '<iframe width="'.$width.'" height="'.$height.'"
src="'.$src.'&output=embed" ></iframe>';
}
add_shortcode("googlemap", “googlemap_function");
Pantalla de
configuración
Pantalla de configuración
<?php
add_menu_page($page_title, $menu_title, $capability,
$menu_slug, $function, $icon_url, $position);
?>
dariobf.com
Pantalla de configuración
<?php
add_action('admin_menu', 'test_plugin_setup_menu');
function test_plugin_setup_menu(){
add_menu_page( 'Test Plugin Page', 'Test Plugin',
'manage_options', 'test-plugin', 'test_init' );
}
function test_init(){
echo "<h1>Hello World!</h1>";
}
?>
http://www.1stwebdesigner.com/wordpress-plugin-development-settings-page/
dariobf.com
#8
Interactuando con
la base de datos
$wpdb
WordPress define una clase llamada wpdb, que contiene una serie
de funciones utilizadas para interactuar con la base de datos. El
objetivo principal es proporcionar una interfaz con la base de datos,
pero se puede utilizar para comunicarse con otra base de datos
cualquiera.
dariobf.com
<?php
// set the meta_key to the appropriate custom field meta key
$meta_key = 'miles';
$allmiles = $wpdb->get_var( $wpdb->prepare(
"
SELECT sum(meta_value)
FROM $wpdb->postmeta
WHERE meta_key = %s
",
$meta_key
) );
echo "<p>Total miles is {$allmiles}</p>";
?>
https://codex.wordpress.org/Class_Reference/wpdb
dariobf.com
#9
WP_Cron
WP_Cron
Cuando vemos la palabra cron, nos imaginamos tareas
programadas a una hora concreta para ejecutarse durante
intervalos específicos.
Al contrario, WP-Cron no es lo mismo que el cron de Unix.
La gran diferencia está en su ejecución: WP_Cron se ejecuta
cuando un visitante abre tu sitio WordPress. Es decir, su ejecución
es imprecisa.
dariobf.com
WP_Cron
Para entender bien WP_Cron es importante tener localizado el
catálogo de sus funciones: http://codex.wordpress.org/Category:WP-Cron_Functions
Para nuestro propósito (contar los seguidores de feedburner) no
tiene sentido hacerlo en cada carga de página en WordPress.
Para ello utilizaremos la función wp_schedule_event(), que recibe
estos parámetros:
• Hora: Hora en formato Unix especificando cuándo se invoca.
• Recurrencia: Con qué frecuencia debe ser re-invocado después
del tiempo programado.
• Hook: El Hook que utilizaremos para añadir la funcionalidad
cuando sea invocado.
• Args: (opcional) Los argumentos a pasar (en array) para pasarle a
las funciones enganchadas al hook.
dariobf.com
WP_Cron
dariobf.com
WP_Cron
Programado
Como feedburner se actualiza diariamente, nuestra programación
será diaria (daily).
<?php
wp_schedule_event( time(), 'daily', 'feedburner_refresh' );
?>
dariobf.com
WP_Cron
Programado
La forma sencilla de evitar esto, es hacer la comprobación
siguiente:
<?php
if( !wp_next_scheduled( 'feedburner_refresh' ) ) {
wp_schedule_event( time(), 'daily', 'feedburner_refresh' );
}
?>
dariobf.com
WP_Cron
Desprogramado
Si necesitamos desprogramar un evento, es tan sencillo como
utilizar la función wp_unschedule_event(), que requiere los mismos
parámetros que wp_schedule_event().
Hay que tener en cuenta que el parámetro “time” será el del
próximo evento a invocar (de nuestro programado); esto lo
obtendremos con wp_next_scheduled().
<?php
if( false !== ($time = wp_next_scheduled('feedburner_refresh'))) {
wp_unschedule_event( $time, 'feedburner_refresh' );
}
?>
dariobf.com
WP_Cron
Desprogramado
<?php
wp_clear_scheduled_hook( 'feedburner_refresh' );
?>
dariobf.com
WP_Cron
Ejecutando
Ahora que ya tenemos programado nuestro evento, sólo falta
definir qué queremos hacer con él.
<?php
add_action( 'feedburner_refresh', 'update_rss_subscriber_count' );
?>
dariobf.com
#10
Widgets
Definir barra lateral
En el functions.php:
dariobf.com
Mostrar barra lateral
En nuestra plantilla:
dynamic_sidebar($sidebar);
<ul id="sidebar">
<?php if ( !function_exists('dynamic_sidebar') || !
dynamic_sidebar() ) : ?>
<li>{static sidebar item 1}</li>
<li>{static sidebar item 2}</li>
<?php endif; ?>
</ul>
dariobf.com
Ideas para Widgets
• Crear un widget que diferencie tu tema de alguna manera.
• Registrar un widget para reemplazar a uno original y modificarlo
de alguna manera.
• Recuerde que un "widget" realmente no es más que un nombre
para un código configurable. Puede ser invisible o posicionarse
de forma absoluta; horizontalmente o verticalmente.
• Utilice los atributos de clase y el id de uno o todos los widgets en
los scripts para animar su barra lateral.
• Puedes utilizar jQuery (incluido con WordPress) para hacer sus
widgets arrastrables o replegables...
dariobf.com