SlideShare a Scribd company logo
1 of 63
Download to read offline
Código mantenible,
con WordPress
Asier Marqués @asiermarques
De qué va esta charla
Introducción a los conceptos básicos de desarrollo
con WordPress
Abrir perspectiva sobre buenas prácticas sobre este
CMS
Mostrar código mantenible, cercano al que
crearíamos con Symfony2, Silex o Laravel
/me
Asier Marqués
simettric.com & 4visionshq.com
linkedin.com/in/asier
@asiermarques
El 23% de Internet utiliza
WordPress.
• techcrunch.com
• thenewyorker.com
• BBC America
• Time Inc
• Fortune
• Google Ventures
• The walking dead
• The rolling stones
Beneficios
• Es un CMS muy conocido, muchos usuarios ya
saben utilizar su backoffice
• Existe una gran cantidad de plugins
• Existe una gran cantidad de themes
• Un mercado amplio
Puntos negativos
• Una base de desarrollo obsoleta
• Gran cantidad de plugins que no tienen ningún
tipo de requisito de calidad
• Atado a un esquema de base de datos concreto
• Para proyectos cuyo core de negocio se salga de
contenido, puede quedarse corto sin un coste de
mantenimiento elevado
Cuando leemos en los requisitos que el proyecto
debe programarse sobre Wordpress…
Guarrindongadas!!!
¿De qué se compone
Wordpress?
• Plugins y Themes
• Filters y actions
• WP_Query y loop
• Custom post type y taxonomies
MultiSite
• WordPress es multisite
• Disponemos de funciones, actions y filters
específicos para gestionar los blogs dentro de un
network
• Casi todas esas funciones son las originales del
proyecto Wordpress Mu
http://codex.wordpress.org/WPMU_Functions
wpmu_create_blog($domain, $path, $title, $user_id, $meta, $site_id)
Backoffice
• Nos permite gestionar nuestro sitio y nuestro contenido
• Es totalmente personalizable, podemos
• Añadir secciones en el menú
• Añadir columnas en las tablas de contenido
• Añadir campos, y metaboxes, para usuarios, contenido
y terms
• Añadir campos y opciones a los menús dinámicos de
themes
Post Types
• Todo es un Post
• Por defecto tenemos contenido de tipo post, page
y attachment.
• El contenido puede ser jerárquico
• El contenido tiene un archivo
• El contenido puede tener metainformación
Custom post type
register_post_type( 'book', array(
'labels' => array(“name” => “Libros”),
'public' => true,
'rewrite' => array( 'slug' => 'books' ),
'has_archive' => true,
'hierarchical' => false,
'supports' => array( 'title', 'editor', 'thumbnail', 'comments' )
);
Custom post type
$product = get_post( $product_id );
$product_color = get_post_meta( $product, “color”, true);
$products = get_posts( array( “post_type” => “product” ) );
foreach( $products as $product ){
echo get_the_title( $product );
}
Taxonomies
• Todas las taxonomias son terms
• Por defecto tenemos los term “tag” y “category”
• Los term pueden ser jerárquicos o no
• Por defecto no hay soporte de metainformación
Custom taxonomy
register_taxonomy( ‘author’, 'book', array(
'hierarchical' => false,
'labels' => array( “name”=> “Autor” ),
'show_admin_column' => true,
'update_count_callback' => '_update_post_term_count',
'rewrite' => array( 'slug' => ‘authors’ ),
));
Custom Taxonomy
$terms = get_terms(“talla”, array(“order_by”=>”count”));
foreach( $terms as $term ){
echo $term->name;
}
$product_terms = wp_get_post_terms( $product, “talla” );
Obtener enlaces
get_permalink($post);
get_term_link($term, “color”);
get_post_type_archive_link( “post_type” )
wp_get_attachment_url( $post->ID );
$src_array = wp_get_attachment_image_src($post->ID, “size”);
$image_src = $src_array[0];
Plugins vs Themes
• La responsabilidad principal de un theme es la de
dotar de un diseño al sitio web
• La responsabilidad de un plugin es la de dotar
funcionalidad y personalización, sin acoplarse a un
theme especifico
• Un theme puede actuar adicionalmente como plugin
• Los plugins pueden personalizar las funciones core
de tipo “pluggables”
Themes
Los archivos más
importantes en un theme
• styles.css
• index.php
• header.php y footer.php
• functions.php
index.php
get_header(“key”); //header-key.php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
//nuestro código
}
}
get_footer(“key”); //footer-key.php
header.php
<html>
<head>
<?php wp_head(); ?>
</head>
<body>
footer.php
<?php wp_footer(); ?>
</body>
</html>
Template Hierarchy
archive-producto.php -> archive.php -> index.php
single-producto.php -> single.php -> index.php
taxonomy-color.php -> taxonomy.php -> index.php
search.php -> index.php
404.php -> index.php
front-page -> index.php
home.php -> index.php
http://codex.wordpress.org/Template_Hierarchy
Loop
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post(); ?>
<h2><?php the_title() ?></h2>
<p><?php the_content() ?></p>
<?php }
}
En realidad es un WP_Query
<?php
global $wp_query;
if ( $wp_query->have_posts() ) {
while ( $wp_query->have_posts() ) {
$post = $wp_query->the_post(); ?>
<h2><?php echo get_the_title($post) ?></h2>
<p><?php echo get_the_content($post) ?></p>
<?php }
}
Actions y Filters
• Nos podemos suscribir a ellos para modificar y
extender Wordpress
• Los actions actúan como eventos a los que nos
suscribimos para realizar una operación.
• Los filters también son eventos, pero nos permiten
manipular información o html del template.
Request y ejecución
1. Se recibe la petición HTTP
2. El sistema de routing hace el match de la ruta que
coincida con la url de la petición
3. Se crea el objeto WP_Query y las query_vars
4. En base al WP_Query se localiza el template
5. Se retorna el resultado
http://codex.wordpress.org/Plugin_API/Action_Reference
Request y ejecución
1. /category/animales = index.php?category=animales
2. new WP_Query( array( “category” => “animales”) );
3. theme/category.php
Rutas personalizadas
add_action('init', function() {
add_rewrite_rule(
‘^tasks/([^/]*)/([^/]*)/?’,
’index.php?post_type=“task”&category=$matches[1]&custom=$matches[2]',
‘top'
);
       add_rewrite_tag('%custom%', '(([^/]*))');
});
Rutas personalizadas
Al crear la WP_Query, se incluyen los anteriores
parámetros:
$wp_query->query_vars[“post_type”]
$wp_query->query_vars[“category”]
$wp_query->query_vars[“custom”]
Queries
WP_Query $wp_query
http://codex.wordpress.org/Class_Reference/WP_Query
wpdb $wpdb
http://codex.wordpress.org/Class_Reference/wpdb
$wp_query = new WP_Query(array(
“post_type” => “producto”,
“nombre_taxonomy” => “valor”,
“posts_per_page” => 20,
“meta_query” => array(
“relation” => “OR”,
array( “meta_key” => “color”, “meta_value” => “azul” ),
array( “meta_key” => “precio”,
“meta_value” => array(20, 200),
“compare” => “BETWEEN”,
“type” => numeric ) )
));
$wp_query = new WP_Query(array(
“post_type” => “producto”,
“nombre_taxonomy” => “valor”,
“posts_per_page” => 20,
“meta_query” => array(
“relation” => “OR”,
array( “meta_key” => “color”, “meta_value” => “azul” ),
array( “meta_key” => “precio”,
“meta_value” => array(20, 200),
“compare” => “BETWEEN”,
“type” => numeric ) )
));
WP_Query
//obtenemos el SQL de la consulta
$sql = $wp_query->request;
//obtenemos los posts de resultados de la consulta
$posts = $wp_query->get_posts();
WPDB
$posts = $wpdb->get_results(
“ SELECT * FROM $wpdb->posts
WHERE post_status = ‘publish'" );
WPDB
$wpdb->prepare( "SELECT * FROM table WHERE ID = %d", $id );
$wpdb->update( $table, $data_array, $where_array);
$wpdb->delete( $table, $where_array );
Templates personalizadas
add_filter( 'template_include', function ( $template ) {
if ( is_page( get_option(“landing_page_id”) ) ) {
$template = __DIR__ . “/../Templates/landing.php“;
}
return $template;
}
function replaceQuery(WP_Query $wp_query){
if( get_option(“landing_page_id”) ){
//cambiamos el loop de la portada
$wp_query = new WP_Query(array( “category” => 1 ));
//evitamos un loop infinito
remove_action(“replaceQuery”);
}
};
add_action(“pre_get_posts”, “replaceQuery”);
Ajax
$.getJSON( ajaxurl,
{ action: “controller.action” },
function( data ){
});
Ajax: En el Backend
add_action('wp_head',function() {
?>
<script type="text/javascript">
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
</script>
<?php
});
add_action( ‘wp_ajax_controller.action’, “callback”);
add_action( 'wp_ajax_nopriv_controller.action’, “callback”);
Herramientas
• Gestión de librerías: composer
• Inyección de dependencias: Symfony o Pimple
• Configuración: Yaml y Configuration Component
• Assets: Assetic
• Templates: Twig
Composer
WordPress no ofrece gestión de librerías ni
componentes por Composer
Por suerte existe el proyecto wpackagist.org
Demo
Inyección de dependencias
Nos permite hacer más portable y desacoplado
nuestro código.
• Pimple
• Symfony Dependency Injection
Inyección de dependencias
$container[“wp_query”] = function ($c) use ($wp_query) {
return $wp_query;
};
$container[“blog.repository”] = function ($c) {
return new WPBlogRepository($c[“wp_query”]);
};
$container[“blog.model”] = function(){
return new BlogModel( $c[“blog.repository”] );
}
Modelo Portable
class BlogModel {
private $_repository;
function __construct(RepositoryInterface $adapter){
$this->_repository = $adapter;
}
function getPosts($page, $limit=20){
return $this->_repository->getPosts($page, $limit);
}
}
Assets
• Wordpress nos permite registrar y encolar scripts
(y css) gestionando sus dependencias
• Al llamar al wp_head o wp_footer, los scripts y
hojas de estilos se añaden de forma automática al
html de la página
Assets
wp_enqueue_script( ‘bootstrap',
get_template_directory_uri() . '/assets/js/bootstrap.min.js',
array('jquery'),
'3.0.0',
$in_footer = true
);
Assetic
• Assetic nos permite gestionar de forma más
avanzada los assets, uniéndolos y optimizándolos
para servirlos en la página.
• Mediante el plugin WPAssetic podemos disponer
de esta utilidad en nuestro sitio
WP Cron
Al activar un plugin o theme, nos permite disparar eventos con
una periodicidad concreta
register_activation_hook( __FILE__, function() {
wp_schedule_event( time(), 'hourly', ‘evento_cada_hora’ );
});
add_action( ‘evento_cada_hora', function(){
});
Rendimiento con Varnish
• Varnish es un servicio de proxy-cache que permite
servir el resultado del html desde memoria
• Podemos actualizar e invalidar la caché de nuestro
contenido de forma automática mediante el plugin
wp varnish
Pluggable
• WordPress permite sobreescribir algunas
funciones internas desde nuestros plugins.
• Dichas funciones se denominan pluggables
Pluggable Emails
if ( !function_exists('wp_new_user_notification') ) {


function wp_new_user_notification( $user_id, $plaintext_pass = '' ) {
wp_email( “to@example.com”, “asunto”, “cuerpo del mensaje” );
}
}
Caché
Wordpress tiene una cache clave-valor mediante un
conjunto de funciones llamadas transients
Utilizan de forma interna el objeto wp_object_cache
set_transient( ‘datos_cacheados',
$datos,
12 * HOUR_IN_SECONDS );
TDD
WordPress test framework:
https://github.com/nb/wordpress-tests.git
WP Mock
https://github.com/10up/wp_mock
http://slides.com/jlopezmo/test-driven-development-in-wordpress
Gracias!
¿Preguntas?
Asier Marqués
@asiermarques
asier@simettric.com

More Related Content

What's hot

Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryJavier P.
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryJavier P.
 
tutorial de slide.com
tutorial de slide.comtutorial de slide.com
tutorial de slide.comoctabio
 
Php excel
Php excelPhp excel
Php excelpcuseth
 
Symfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónSymfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónRodrigo Miranda
 
Haciendo Patria con Sinatra
Haciendo Patria con SinatraHaciendo Patria con Sinatra
Haciendo Patria con Sinatrafebuiles
 
Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...jbersosa
 
Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalMediaglobe Innova
 
La api de salesforce
La api de salesforceLa api de salesforce
La api de salesforcejesusnoseq
 
jQuery
jQueryjQuery
jQueryCoya14
 
Julissarodriguezvilca
JulissarodriguezvilcaJulissarodriguezvilca
JulissarodriguezvilcajulissaJRV
 

What's hot (20)

Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
tutorial de slide.com
tutorial de slide.comtutorial de slide.com
tutorial de slide.com
 
Php excel
Php excelPhp excel
Php excel
 
Zend_Acl
Zend_AclZend_Acl
Zend_Acl
 
Assetic PHPmvd
Assetic PHPmvdAssetic PHPmvd
Assetic PHPmvd
 
Jquery
JqueryJquery
Jquery
 
Symfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónSymfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y Migración
 
Ireport
IreportIreport
Ireport
 
Php
PhpPhp
Php
 
Haciendo Patria con Sinatra
Haciendo Patria con SinatraHaciendo Patria con Sinatra
Haciendo Patria con Sinatra
 
Jquery parte 1
Jquery parte 1Jquery parte 1
Jquery parte 1
 
Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...
 
Perl5 hashes
Perl5 hashesPerl5 hashes
Perl5 hashes
 
Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en Drupal
 
La api de salesforce
La api de salesforceLa api de salesforce
La api de salesforce
 
jQuery
jQueryjQuery
jQuery
 
Como hacer de todo con PowerShell
Como hacer de todo con PowerShellComo hacer de todo con PowerShell
Como hacer de todo con PowerShell
 
Julissarodriguezvilca
JulissarodriguezvilcaJulissarodriguezvilca
Julissarodriguezvilca
 
Sumaoctal
SumaoctalSumaoctal
Sumaoctal
 

Viewers also liked

WordPress: éxito y aprendizaje
WordPress: éxito y aprendizajeWordPress: éxito y aprendizaje
WordPress: éxito y aprendizajePatricio Mas
 
Desarrollo WordPress Servicios-Especial necesidades de contenido sofisticado
Desarrollo WordPress Servicios-Especial necesidades de contenido sofisticadoDesarrollo WordPress Servicios-Especial necesidades de contenido sofisticado
Desarrollo WordPress Servicios-Especial necesidades de contenido sofisticadoevajones123
 
Inicio al desarrollo en wordpress
Inicio al desarrollo en wordpressInicio al desarrollo en wordpress
Inicio al desarrollo en wordpressbetabeers
 
Iniciación al Desarrollo Web con Wordpress
Iniciación al Desarrollo Web con WordpressIniciación al Desarrollo Web con Wordpress
Iniciación al Desarrollo Web con WordpressAlejandro Gil Mialdea
 
Cuánto cuesta... tu página web con Wordpress
Cuánto cuesta... tu página web con WordpressCuánto cuesta... tu página web con Wordpress
Cuánto cuesta... tu página web con Wordpresseconred
 
Diseño en Wordpress
Diseño en WordpressDiseño en Wordpress
Diseño en WordpressAndres Karp
 
Crea tu web en wordpress 2015
Crea tu web en wordpress 2015Crea tu web en wordpress 2015
Crea tu web en wordpress 2015Fundació Bit
 
Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1
Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1
Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1José Conti Calveras
 
Curso de Wordpress 2017 - Especial Novatos
Curso de Wordpress 2017 - Especial NovatosCurso de Wordpress 2017 - Especial Novatos
Curso de Wordpress 2017 - Especial NovatosDavid Saez Nova
 
Integrar Wordpress en sitios web ya existentes
Integrar Wordpress en sitios web ya existentesIntegrar Wordpress en sitios web ya existentes
Integrar Wordpress en sitios web ya existentesDavid Merinas Ariza
 
El funcionamiento del WordPress Themes y las posibilidades de personalización
El funcionamiento del WordPress Themes y las posibilidades de personalizaciónEl funcionamiento del WordPress Themes y las posibilidades de personalización
El funcionamiento del WordPress Themes y las posibilidades de personalizaciónComunidadRedDes
 
Curso de diseño web con wordpress. tema 1
Curso de diseño web con wordpress. tema 1Curso de diseño web con wordpress. tema 1
Curso de diseño web con wordpress. tema 1Mumaprojects
 
Curso iniciacion al diseño web con WordPress
Curso iniciacion al diseño web con WordPressCurso iniciacion al diseño web con WordPress
Curso iniciacion al diseño web con WordPressDuyal Servicios Web
 
Haz tu web con un CMS - (Módulo 2 del curso de HTML5)
Haz tu web con un CMS - (Módulo 2 del curso de HTML5)Haz tu web con un CMS - (Módulo 2 del curso de HTML5)
Haz tu web con un CMS - (Módulo 2 del curso de HTML5)Josep Massó Carreras
 
Analitica Web y Wordpress con Google Analytics - #WPValladolid
Analitica Web y Wordpress con Google Analytics - #WPValladolidAnalitica Web y Wordpress con Google Analytics - #WPValladolid
Analitica Web y Wordpress con Google Analytics - #WPValladolidMJ Cachón Yáñez
 
Creacion de sitios web a medida con CMS
Creacion de sitios web a medida con CMSCreacion de sitios web a medida con CMS
Creacion de sitios web a medida con CMSzarmath
 
Optimización de sitios web hechos con WordPress
Optimización de sitios web hechos con WordPressOptimización de sitios web hechos con WordPress
Optimización de sitios web hechos con WordPressDani Reguera Bakhache
 
WordPress como CMS - Congreso Web 2012
WordPress como CMS - Congreso Web 2012WordPress como CMS - Congreso Web 2012
WordPress como CMS - Congreso Web 2012idibay
 
Wordpress: De un Blog a un CMS
Wordpress: De un Blog a un CMSWordpress: De un Blog a un CMS
Wordpress: De un Blog a un CMSJoselyn Anfossi
 

Viewers also liked (20)

WordPress: éxito y aprendizaje
WordPress: éxito y aprendizajeWordPress: éxito y aprendizaje
WordPress: éxito y aprendizaje
 
Desarrollo WordPress Servicios-Especial necesidades de contenido sofisticado
Desarrollo WordPress Servicios-Especial necesidades de contenido sofisticadoDesarrollo WordPress Servicios-Especial necesidades de contenido sofisticado
Desarrollo WordPress Servicios-Especial necesidades de contenido sofisticado
 
Inicio al desarrollo en wordpress
Inicio al desarrollo en wordpressInicio al desarrollo en wordpress
Inicio al desarrollo en wordpress
 
Wordpress Meetup - Junio 2015
Wordpress Meetup - Junio 2015Wordpress Meetup - Junio 2015
Wordpress Meetup - Junio 2015
 
Iniciación al Desarrollo Web con Wordpress
Iniciación al Desarrollo Web con WordpressIniciación al Desarrollo Web con Wordpress
Iniciación al Desarrollo Web con Wordpress
 
Cuánto cuesta... tu página web con Wordpress
Cuánto cuesta... tu página web con WordpressCuánto cuesta... tu página web con Wordpress
Cuánto cuesta... tu página web con Wordpress
 
Diseño en Wordpress
Diseño en WordpressDiseño en Wordpress
Diseño en Wordpress
 
Crea tu web en wordpress 2015
Crea tu web en wordpress 2015Crea tu web en wordpress 2015
Crea tu web en wordpress 2015
 
Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1
Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1
Presentación Jose Conti Barcelona Meetup WordPress 4.0 y 4.1
 
Curso de Wordpress 2017 - Especial Novatos
Curso de Wordpress 2017 - Especial NovatosCurso de Wordpress 2017 - Especial Novatos
Curso de Wordpress 2017 - Especial Novatos
 
Integrar Wordpress en sitios web ya existentes
Integrar Wordpress en sitios web ya existentesIntegrar Wordpress en sitios web ya existentes
Integrar Wordpress en sitios web ya existentes
 
El funcionamiento del WordPress Themes y las posibilidades de personalización
El funcionamiento del WordPress Themes y las posibilidades de personalizaciónEl funcionamiento del WordPress Themes y las posibilidades de personalización
El funcionamiento del WordPress Themes y las posibilidades de personalización
 
Curso de diseño web con wordpress. tema 1
Curso de diseño web con wordpress. tema 1Curso de diseño web con wordpress. tema 1
Curso de diseño web con wordpress. tema 1
 
Curso iniciacion al diseño web con WordPress
Curso iniciacion al diseño web con WordPressCurso iniciacion al diseño web con WordPress
Curso iniciacion al diseño web con WordPress
 
Haz tu web con un CMS - (Módulo 2 del curso de HTML5)
Haz tu web con un CMS - (Módulo 2 del curso de HTML5)Haz tu web con un CMS - (Módulo 2 del curso de HTML5)
Haz tu web con un CMS - (Módulo 2 del curso de HTML5)
 
Analitica Web y Wordpress con Google Analytics - #WPValladolid
Analitica Web y Wordpress con Google Analytics - #WPValladolidAnalitica Web y Wordpress con Google Analytics - #WPValladolid
Analitica Web y Wordpress con Google Analytics - #WPValladolid
 
Creacion de sitios web a medida con CMS
Creacion de sitios web a medida con CMSCreacion de sitios web a medida con CMS
Creacion de sitios web a medida con CMS
 
Optimización de sitios web hechos con WordPress
Optimización de sitios web hechos con WordPressOptimización de sitios web hechos con WordPress
Optimización de sitios web hechos con WordPress
 
WordPress como CMS - Congreso Web 2012
WordPress como CMS - Congreso Web 2012WordPress como CMS - Congreso Web 2012
WordPress como CMS - Congreso Web 2012
 
Wordpress: De un Blog a un CMS
Wordpress: De un Blog a un CMSWordpress: De un Blog a un CMS
Wordpress: De un Blog a un CMS
 

Similar to Código mantenible, en Wordpress.

Desarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyAsier Marqués
 
Desarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbao
Desarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbaoDesarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbao
Desarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbaoDarío BF
 
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...Asociación Webmasters Cantabria
 
WordPress, mucho más que un CMS para Blogs!!!
WordPress, mucho más que un CMS para Blogs!!!WordPress, mucho más que un CMS para Blogs!!!
WordPress, mucho más que un CMS para Blogs!!!Daniel Bertinat
 
Customizer: configurando un sitio en tiempo real
Customizer: configurando un sitio en tiempo realCustomizer: configurando un sitio en tiempo real
Customizer: configurando un sitio en tiempo realwpargentina
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
PHP Tema 7 - Seguridad
PHP Tema 7 - SeguridadPHP Tema 7 - Seguridad
PHP Tema 7 - SeguridadSpacetoshare
 
Varnish para meros mortales
Varnish para meros mortalesVarnish para meros mortales
Varnish para meros mortalesMartín .
 
Gustavo php
Gustavo phpGustavo php
Gustavo phpGustavo
 
Sacale partido al personalizador
Sacale partido al personalizadorSacale partido al personalizador
Sacale partido al personalizadorPablo López Mestre
 
Presentación de zan php
Presentación de zan phpPresentación de zan php
Presentación de zan phpCarlos Zantana
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Airespeterpunk
 

Similar to Código mantenible, en Wordpress. (20)

Desarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando Symfony
 
Desarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbao
Desarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbaoDesarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbao
Desarrollo de Themes de WordPress desde cero. @DarioBF en @WPBilbao
 
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
La potencia sin control no sirve de nada, claves para aprovechar el uso de Wo...
 
Introducción a los hooks
Introducción a los hooksIntroducción a los hooks
Introducción a los hooks
 
WordPress, mucho más que un CMS para Blogs!!!
WordPress, mucho más que un CMS para Blogs!!!WordPress, mucho más que un CMS para Blogs!!!
WordPress, mucho más que un CMS para Blogs!!!
 
Customizer: configurando un sitio en tiempo real
Customizer: configurando un sitio en tiempo realCustomizer: configurando un sitio en tiempo real
Customizer: configurando un sitio en tiempo real
 
WordPress Custom Post Types
WordPress Custom Post TypesWordPress Custom Post Types
WordPress Custom Post Types
 
Curso de HTML5
Curso de HTML5Curso de HTML5
Curso de HTML5
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Vistiendo a WordPress
Vistiendo a WordPressVistiendo a WordPress
Vistiendo a WordPress
 
PHP Tema 7 - Seguridad
PHP Tema 7 - SeguridadPHP Tema 7 - Seguridad
PHP Tema 7 - Seguridad
 
Symfony 2 CMF
Symfony 2 CMFSymfony 2 CMF
Symfony 2 CMF
 
Varnish para meros mortales
Varnish para meros mortalesVarnish para meros mortales
Varnish para meros mortales
 
Webperf wordpress
Webperf wordpressWebperf wordpress
Webperf wordpress
 
Gustavo php
Gustavo phpGustavo php
Gustavo php
 
9.laravel
9.laravel9.laravel
9.laravel
 
Presentacion YII
Presentacion YIIPresentacion YII
Presentacion YII
 
Sacale partido al personalizador
Sacale partido al personalizadorSacale partido al personalizador
Sacale partido al personalizador
 
Presentación de zan php
Presentación de zan phpPresentación de zan php
Presentación de zan php
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 

More from Asier Marqués

Creando Productos SaaS
Creando Productos SaaSCreando Productos SaaS
Creando Productos SaaSAsier Marqués
 
Ejecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetEjecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetAsier Marqués
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsAsier Marqués
 
Presentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgPresentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgAsier Marqués
 
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Asier Marqués
 
Albero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAlbero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAsier Marqués
 
Bilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinBilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinAsier Marqués
 
APIs REST #devfestBilbao
APIs REST #devfestBilbaoAPIs REST #devfestBilbao
APIs REST #devfestBilbaoAsier Marqués
 
Silex para aplicaciones web MVC
Silex para aplicaciones web MVCSilex para aplicaciones web MVC
Silex para aplicaciones web MVCAsier Marqués
 
Servicios REST - PucelaTechDay
Servicios REST - PucelaTechDayServicios REST - PucelaTechDay
Servicios REST - PucelaTechDayAsier Marqués
 
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetDesarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetAsier Marqués
 
BilboStack - Php en el 2012
BilboStack - Php en el 2012BilboStack - Php en el 2012
BilboStack - Php en el 2012Asier Marqués
 
4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbaoAsier Marqués
 
Proyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoProyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoAsier Marqués
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Asier Marqués
 
Symfony, cloud computing y web escalables
Symfony, cloud computing y web escalablesSymfony, cloud computing y web escalables
Symfony, cloud computing y web escalablesAsier Marqués
 
Sistemas Microsoft Windows
Sistemas Microsoft WindowsSistemas Microsoft Windows
Sistemas Microsoft WindowsAsier Marqués
 

More from Asier Marqués (20)

Creando Productos SaaS
Creando Productos SaaSCreando Productos SaaS
Creando Productos SaaS
 
Introducción a Bolt
Introducción a BoltIntroducción a Bolt
Introducción a Bolt
 
PHP en el 2015
PHP en el 2015PHP en el 2015
PHP en el 2015
 
Ejecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en InternetEjecución de servicios digitales y negocios en Internet
Ejecución de servicios digitales y negocios en Internet
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web Apps
 
Presentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.orgPresentación de la plataforma abierta Ubiqarama.org
Presentación de la plataforma abierta Ubiqarama.org
 
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
Calidad, IC y Entrega contínua en Symfony2 con Azure - Parte 1
 
Albero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarinAlbero tech Day - De web a móvil con xamarin
Albero tech Day - De web a móvil con xamarin
 
Bilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con XamarinBilbostack 2014: De web a móvil con Xamarin
Bilbostack 2014: De web a móvil con Xamarin
 
APIs REST #devfestBilbao
APIs REST #devfestBilbaoAPIs REST #devfestBilbao
APIs REST #devfestBilbao
 
Silex para aplicaciones web MVC
Silex para aplicaciones web MVCSilex para aplicaciones web MVC
Silex para aplicaciones web MVC
 
Servicios REST - PucelaTechDay
Servicios REST - PucelaTechDayServicios REST - PucelaTechDay
Servicios REST - PucelaTechDay
 
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internetDesarrollo de aplicaciones Windows8 para desarrolladores de internet
Desarrollo de aplicaciones Windows8 para desarrolladores de internet
 
REST - deSymfony2012
REST - deSymfony2012REST - deSymfony2012
REST - deSymfony2012
 
BilboStack - Php en el 2012
BilboStack - Php en el 2012BilboStack - Php en el 2012
BilboStack - Php en el 2012
 
4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao4VisionsManager en WebDevBilbao
4VisionsManager en WebDevBilbao
 
Proyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbaoProyectos fallidos: Rooms.fm en #webdevbilbao
Proyectos fallidos: Rooms.fm en #webdevbilbao
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2
 
Symfony, cloud computing y web escalables
Symfony, cloud computing y web escalablesSymfony, cloud computing y web escalables
Symfony, cloud computing y web escalables
 
Sistemas Microsoft Windows
Sistemas Microsoft WindowsSistemas Microsoft Windows
Sistemas Microsoft Windows
 

Recently uploaded

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 

Recently uploaded (10)

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 

Código mantenible, en Wordpress.

  • 2. De qué va esta charla Introducción a los conceptos básicos de desarrollo con WordPress Abrir perspectiva sobre buenas prácticas sobre este CMS Mostrar código mantenible, cercano al que crearíamos con Symfony2, Silex o Laravel
  • 3. /me Asier Marqués simettric.com & 4visionshq.com linkedin.com/in/asier @asiermarques
  • 4. El 23% de Internet utiliza WordPress.
  • 5. • techcrunch.com • thenewyorker.com • BBC America • Time Inc • Fortune
  • 6. • Google Ventures • The walking dead • The rolling stones
  • 7. Beneficios • Es un CMS muy conocido, muchos usuarios ya saben utilizar su backoffice • Existe una gran cantidad de plugins • Existe una gran cantidad de themes • Un mercado amplio
  • 8. Puntos negativos • Una base de desarrollo obsoleta • Gran cantidad de plugins que no tienen ningún tipo de requisito de calidad • Atado a un esquema de base de datos concreto • Para proyectos cuyo core de negocio se salga de contenido, puede quedarse corto sin un coste de mantenimiento elevado
  • 9. Cuando leemos en los requisitos que el proyecto debe programarse sobre Wordpress…
  • 11. ¿De qué se compone Wordpress? • Plugins y Themes • Filters y actions • WP_Query y loop • Custom post type y taxonomies
  • 12. MultiSite • WordPress es multisite • Disponemos de funciones, actions y filters específicos para gestionar los blogs dentro de un network • Casi todas esas funciones son las originales del proyecto Wordpress Mu
  • 14. Backoffice • Nos permite gestionar nuestro sitio y nuestro contenido • Es totalmente personalizable, podemos • Añadir secciones en el menú • Añadir columnas en las tablas de contenido • Añadir campos, y metaboxes, para usuarios, contenido y terms • Añadir campos y opciones a los menús dinámicos de themes
  • 15. Post Types • Todo es un Post • Por defecto tenemos contenido de tipo post, page y attachment. • El contenido puede ser jerárquico • El contenido tiene un archivo • El contenido puede tener metainformación
  • 16. Custom post type register_post_type( 'book', array( 'labels' => array(“name” => “Libros”), 'public' => true, 'rewrite' => array( 'slug' => 'books' ), 'has_archive' => true, 'hierarchical' => false, 'supports' => array( 'title', 'editor', 'thumbnail', 'comments' ) );
  • 17. Custom post type $product = get_post( $product_id ); $product_color = get_post_meta( $product, “color”, true); $products = get_posts( array( “post_type” => “product” ) ); foreach( $products as $product ){ echo get_the_title( $product ); }
  • 18. Taxonomies • Todas las taxonomias son terms • Por defecto tenemos los term “tag” y “category” • Los term pueden ser jerárquicos o no • Por defecto no hay soporte de metainformación
  • 19. Custom taxonomy register_taxonomy( ‘author’, 'book', array( 'hierarchical' => false, 'labels' => array( “name”=> “Autor” ), 'show_admin_column' => true, 'update_count_callback' => '_update_post_term_count', 'rewrite' => array( 'slug' => ‘authors’ ), ));
  • 20. Custom Taxonomy $terms = get_terms(“talla”, array(“order_by”=>”count”)); foreach( $terms as $term ){ echo $term->name; } $product_terms = wp_get_post_terms( $product, “talla” );
  • 21. Obtener enlaces get_permalink($post); get_term_link($term, “color”); get_post_type_archive_link( “post_type” ) wp_get_attachment_url( $post->ID ); $src_array = wp_get_attachment_image_src($post->ID, “size”); $image_src = $src_array[0];
  • 22. Plugins vs Themes • La responsabilidad principal de un theme es la de dotar de un diseño al sitio web • La responsabilidad de un plugin es la de dotar funcionalidad y personalización, sin acoplarse a un theme especifico • Un theme puede actuar adicionalmente como plugin • Los plugins pueden personalizar las funciones core de tipo “pluggables”
  • 24. Los archivos más importantes en un theme • styles.css • index.php • header.php y footer.php • functions.php
  • 25. index.php get_header(“key”); //header-key.php if ( have_posts() ) { while ( have_posts() ) { the_post(); //nuestro código } } get_footer(“key”); //footer-key.php
  • 28. Template Hierarchy archive-producto.php -> archive.php -> index.php single-producto.php -> single.php -> index.php taxonomy-color.php -> taxonomy.php -> index.php search.php -> index.php 404.php -> index.php front-page -> index.php home.php -> index.php
  • 30. Loop <?php if ( have_posts() ) { while ( have_posts() ) { the_post(); ?> <h2><?php the_title() ?></h2> <p><?php the_content() ?></p> <?php } }
  • 31. En realidad es un WP_Query <?php global $wp_query; if ( $wp_query->have_posts() ) { while ( $wp_query->have_posts() ) { $post = $wp_query->the_post(); ?> <h2><?php echo get_the_title($post) ?></h2> <p><?php echo get_the_content($post) ?></p> <?php } }
  • 32. Actions y Filters • Nos podemos suscribir a ellos para modificar y extender Wordpress • Los actions actúan como eventos a los que nos suscribimos para realizar una operación. • Los filters también son eventos, pero nos permiten manipular información o html del template.
  • 33. Request y ejecución 1. Se recibe la petición HTTP 2. El sistema de routing hace el match de la ruta que coincida con la url de la petición 3. Se crea el objeto WP_Query y las query_vars 4. En base al WP_Query se localiza el template 5. Se retorna el resultado http://codex.wordpress.org/Plugin_API/Action_Reference
  • 34. Request y ejecución 1. /category/animales = index.php?category=animales 2. new WP_Query( array( “category” => “animales”) ); 3. theme/category.php
  • 35. Rutas personalizadas add_action('init', function() { add_rewrite_rule( ‘^tasks/([^/]*)/([^/]*)/?’, ’index.php?post_type=“task”&category=$matches[1]&custom=$matches[2]', ‘top' );        add_rewrite_tag('%custom%', '(([^/]*))'); });
  • 36. Rutas personalizadas Al crear la WP_Query, se incluyen los anteriores parámetros: $wp_query->query_vars[“post_type”] $wp_query->query_vars[“category”] $wp_query->query_vars[“custom”]
  • 38. $wp_query = new WP_Query(array( “post_type” => “producto”, “nombre_taxonomy” => “valor”, “posts_per_page” => 20, “meta_query” => array( “relation” => “OR”, array( “meta_key” => “color”, “meta_value” => “azul” ), array( “meta_key” => “precio”, “meta_value” => array(20, 200), “compare” => “BETWEEN”, “type” => numeric ) ) ));
  • 39. $wp_query = new WP_Query(array( “post_type” => “producto”, “nombre_taxonomy” => “valor”, “posts_per_page” => 20, “meta_query” => array( “relation” => “OR”, array( “meta_key” => “color”, “meta_value” => “azul” ), array( “meta_key” => “precio”, “meta_value” => array(20, 200), “compare” => “BETWEEN”, “type” => numeric ) ) ));
  • 40. WP_Query //obtenemos el SQL de la consulta $sql = $wp_query->request; //obtenemos los posts de resultados de la consulta $posts = $wp_query->get_posts();
  • 41. WPDB $posts = $wpdb->get_results( “ SELECT * FROM $wpdb->posts WHERE post_status = ‘publish'" );
  • 42. WPDB $wpdb->prepare( "SELECT * FROM table WHERE ID = %d", $id ); $wpdb->update( $table, $data_array, $where_array); $wpdb->delete( $table, $where_array );
  • 43. Templates personalizadas add_filter( 'template_include', function ( $template ) { if ( is_page( get_option(“landing_page_id”) ) ) { $template = __DIR__ . “/../Templates/landing.php“; } return $template; }
  • 44. function replaceQuery(WP_Query $wp_query){ if( get_option(“landing_page_id”) ){ //cambiamos el loop de la portada $wp_query = new WP_Query(array( “category” => 1 )); //evitamos un loop infinito remove_action(“replaceQuery”); } }; add_action(“pre_get_posts”, “replaceQuery”);
  • 45. Ajax $.getJSON( ajaxurl, { action: “controller.action” }, function( data ){ });
  • 46. Ajax: En el Backend add_action('wp_head',function() { ?> <script type="text/javascript"> var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>'; </script> <?php }); add_action( ‘wp_ajax_controller.action’, “callback”); add_action( 'wp_ajax_nopriv_controller.action’, “callback”);
  • 47. Herramientas • Gestión de librerías: composer • Inyección de dependencias: Symfony o Pimple • Configuración: Yaml y Configuration Component • Assets: Assetic • Templates: Twig
  • 48. Composer WordPress no ofrece gestión de librerías ni componentes por Composer Por suerte existe el proyecto wpackagist.org
  • 49. Demo
  • 50. Inyección de dependencias Nos permite hacer más portable y desacoplado nuestro código. • Pimple • Symfony Dependency Injection
  • 51. Inyección de dependencias $container[“wp_query”] = function ($c) use ($wp_query) { return $wp_query; }; $container[“blog.repository”] = function ($c) { return new WPBlogRepository($c[“wp_query”]); }; $container[“blog.model”] = function(){ return new BlogModel( $c[“blog.repository”] ); }
  • 52. Modelo Portable class BlogModel { private $_repository; function __construct(RepositoryInterface $adapter){ $this->_repository = $adapter; } function getPosts($page, $limit=20){ return $this->_repository->getPosts($page, $limit); } }
  • 53.
  • 54. Assets • Wordpress nos permite registrar y encolar scripts (y css) gestionando sus dependencias • Al llamar al wp_head o wp_footer, los scripts y hojas de estilos se añaden de forma automática al html de la página
  • 55. Assets wp_enqueue_script( ‘bootstrap', get_template_directory_uri() . '/assets/js/bootstrap.min.js', array('jquery'), '3.0.0', $in_footer = true );
  • 56. Assetic • Assetic nos permite gestionar de forma más avanzada los assets, uniéndolos y optimizándolos para servirlos en la página. • Mediante el plugin WPAssetic podemos disponer de esta utilidad en nuestro sitio
  • 57. WP Cron Al activar un plugin o theme, nos permite disparar eventos con una periodicidad concreta register_activation_hook( __FILE__, function() { wp_schedule_event( time(), 'hourly', ‘evento_cada_hora’ ); }); add_action( ‘evento_cada_hora', function(){ });
  • 58. Rendimiento con Varnish • Varnish es un servicio de proxy-cache que permite servir el resultado del html desde memoria • Podemos actualizar e invalidar la caché de nuestro contenido de forma automática mediante el plugin wp varnish
  • 59. Pluggable • WordPress permite sobreescribir algunas funciones internas desde nuestros plugins. • Dichas funciones se denominan pluggables
  • 60. Pluggable Emails if ( !function_exists('wp_new_user_notification') ) { 
 function wp_new_user_notification( $user_id, $plaintext_pass = '' ) { wp_email( “to@example.com”, “asunto”, “cuerpo del mensaje” ); } }
  • 61. Caché Wordpress tiene una cache clave-valor mediante un conjunto de funciones llamadas transients Utilizan de forma interna el objeto wp_object_cache set_transient( ‘datos_cacheados', $datos, 12 * HOUR_IN_SECONDS );
  • 62. TDD WordPress test framework: https://github.com/nb/wordpress-tests.git WP Mock https://github.com/10up/wp_mock http://slides.com/jlopezmo/test-driven-development-in-wordpress