SlideShare una empresa de Scribd logo
1 de 23
WP Customizer
Personalizando tu sitio en tiempo real
Elio Rivero - http://queryloop.com
WordCamp Buenos Aires 2015
¿Para qué implementar el
Customizer?
Para previsualizar instantáneamente
cambios que afecten el front-end.
(predefinidos)
Inicializando el
Customizer
/**
* Registrar paneles, secciones y controles para el Customizer.
* @param object $wp_customize Instancia de WP_Customizer_Manager.
*/
function queryloop_customize_register( $wp_customize ) {
// Iniciar panels, sections, controls y sus settings.
}
add_action( 'customize_register', 'queryloop_customize_register' );
$wp_customize->add_panel( 'panel_id', array(
'title' => __( 'Un Panel', 'queryloop' ),
) );
$wp_customize->add_section( 'section_id', array(
'title' => __( 'Una Sección', 'queryloop' ),
'panel' => 'panel_id',
) );
$wp_customize->add_setting( 'setting_id', array(
'type' => 'theme_mod', // u 'option'
'default' => '', // Valor predeterminado
'transport' => 'refresh', // o postMessage para cambios instantáneos
'capability' => 'edit_theme_options', // capacidad necesaria
'sanitize_callback' => '', // sanear el valor a guardar en el setting
'sanitize_js_callback' => '', // sanear el valor a volcar a la página.
) );
$wp_customize->add_control( new WP_Customize_Control( $wp_customize,
'setting_id', array(
'label' => __( 'Un Control', 'queryloop' ),
'type' => 'text', // 'text' es el predeterminado así que no haría falta
'section' => 'section_id',
'settings' => 'setting_id',
) ) );
Controles Previsualización
is_admin() es true is_admin() es false
Customizer puede usar distintos
Settings
option
Options API
https://codex.wordpress.org/Options_API
theme_mod
Theme Modification API
https://codex.wordpress.org/Theme_Modification_API
¿Otros?
(un wrapper de Options API)
Para emplear el
Customizer
en
Opciones persistentes
e independientes del theme.
Plugins
$wp_customize->add_setting( 'settings[key]', array(
'type' => 'option',
'capability' => 'customize', // nueva capacidad en 4.0 - Trac #28605
) );
Le decimos al Customizer qué
vista cargar y a dónde volver
// http://ejemplo.com/wp-admin/customize.php
$link = add_query_arg(
array(
// http://ejemplo.com/documents/
'url' => urlencode( get_post_type_archive_link( 'document' ) ),
// http://ejemplo.com/wp-admin/options-general.php?page=opciones_plugin
'return' => urlencode(
add_query_arg( 'page', 'opciones_plugin',
admin_url( 'options-general.php' )
)
)
),
admin_url( 'customize.php' )
);
// http://ejemplo.com/wp-admin/customize.php?url=URL&return=RETURN
echo '<a href="' . esc_url( $link ) . '" class="button">' .
__( 'Personalizar', 'queryloop' ) . '</a>';
Agregamos un parámetro para
saber que es una vista del plugin
// http://ejemplo.com/wp-admin/customize.php?url=URL&return=RETURN&miplugin=true
$link = add_query_arg( 'miplugin', 'true', $link );
Visible en los controles
// http://ejemplo.com/documents/?document_id=true
'url' => urlencode(
add_query_arg( ‘document_id', 'true',
get_post_type_archive_link( 'document' )
)
),
Visible en la previsualización
¡Cuidado aquí que el nombre del parámetro no sea un post type!
Mostramos sólo las secciones
de nuestro plugin
/**
* Remueve todas las secciones salvo seccion_1 y seccion_2 de nuestro plugin.
* @param bool Estado de la sección
* @param object Sección a deshabilitar o no.
* @return bool
*/
function queryloop_quitar_secciones( $active, $section ) {
if ( isset( $_GET['document'] ) || ( is_singular( 'document' ) ) ) {
if ( in_array( $section->id, array( 'seccion_1', 'seccion_2' ) ) ) {
return true;
}
return false;
}
return true;
}
add_filter( ‘customize_section_active','queryloop_quitar_secciones', 10, 2 );
Cargamos
JavaScript
para los controles
/**
* Cargamos scripts, sus dependencias y pasamos variables.
*/
function queryloop_cargar_js_controles() {
wp_enqueue_script( 'queryloop-controles', UNA_URL . '/js/customizer-
controls.js', array( 'customize-views' ) );
wp_localize_script( 'queryloop-controles', 'queryloopCustomizerControls',
array(
'focus' => 'control_3', // id de un control
) );
}
add_action( 'customize_controls_enqueue_scripts', array( $this,
'queryloop_cargar_js_controles' ) );
Enfocamos un control específico
(function($){
$(window).load(function(){
if ( ! _.isUndefined( queryloopCustomizerControls ) ) {
wp.customize.control( queryloopCustomizerControls.focus ).focus();
}
});
})(jQuery);
JavaScript en la previsualización
/**
* Carga JavaScript y pasa variables en previsualización.
*
* @since 1.0.0
*/
function queryloop_cargar_js_previa() {
wp_enqueue_script( 'queryloop-customizer', UNA_URL . '/js/ql-customizer-
preview.js', array( 'customize-preview' ) );
$estilos = array();
foreach ( queryloop_obtener_estilos() as $key => $style ) {
$estilos['queryloop_settings[' . $key . ']'] = array(
'selector' => $style['css']['selector'],
'property' => $style['css']['property'],
);
}
wp_localize_script( 'queryloop-customizer', 'queryloopCustomizerPrevia',
$estilos );
}
add_action( 'customize_preview_init', 'queryloop_cargar_js_previa' );
Cambios de CSS instantáneos
if ( ! _.isUndefined( queryloopCustomizerPrevia ) ) {
_.each( queryloopCustomizerPrevia, function(rule, key) {
wp.customize( key, function( value ) {
value.bind( function( valor ) {
$( rule.selector ).css( rule.property, '' );
if ( valor ) {
$( rule.selector ).css( rule.property, valor );
}
});
});
});
}
$wp_customize->add_setting( 'setting', array(
‘transport' => 'postMessage',
) );
Usamos la personalización en el
Front End
$settings = get_option( 'queryloop_settings' );
if ( isset( $settings['mostrar_titulo_pagina'] ) ) {
// mostrar el título de esta página
} else {
// no mostrar título
}
$mostrar_titulo = get_option( 'queryloop_setting_unico' );
if ( $mostrar_titulo ) {
// mostrar el título de esta página
} else {
// no mostrar título
}
Añadimos CSS al front-end con
wp_add_inline_style
/**
* Genera CSS y carga luego del estilo principal.
*/
function queryloop_agregar_estilo() {
$css = '';
foreach ( queryloop_obtener_estilos() as $key => $style ) {
$css .= queryloop_generar_css( $style['selector'], $style['property'],
$key );
}
if ( ! empty( $css ) ) {
wp_add_inline_style( 'estilo-principal', $css );
}
}
add_action( 'wp_enqueue_scripts', 'queryloop_agregar_estilo' );
Usar el Customizer para guardar
Post Meta
con un setting distinto de
option y theme_mod
$wp_customize->add_setting( 'un_meta_key', array(
'type' => 'ql_meta',
'capability' => 'customize',
) );
Creamos el botón para
personalizar nuestra entrada
$permalink = get_the_permalink( $post->ID );
printf(
__( '<a href="%s" class="button">Personalizar Documento</a>',
'queryloop' ),
esc_url( add_query_arg( array(
'url' => urlencode( add_query_arg( array( 'document_id' => $post->ID
), $permalink ) ),
'return' => urlencode( add_query_arg( array( 'post' => $post->ID,
'action' => 'edit', ), admin_url( 'post.php' ) ) ),
'document' => $post->ID,
), admin_url( 'customize.php' ) ) )
);
Pasamos a JavaScript el ID de la
entrada a personalizar
/**
* Cargamos scripts con dependencias y pasamos variables.
*/
function queryloop_cargar_js_controles() {
wp_enqueue_script( 'queryloop-controles', UNA_URL . '/js/customizer-
controls.js', array( 'customize-views' ) );
wp_localize_script( 'queryloop-controles', 'queryloopCustomizerControls',
array(
'focus' => 'control_3',
'customize' => isset( $_GET['document'] ) ? $_GET['document'] :
‘general', // id de la entrada a personalizar
) );
}
add_action( 'customize_controls_enqueue_scripts', array( $this,
Si estamos personalizando el
post, alteramos la URL de AJAX
$(window).load(function(){
if ( ! _.isUndefined( queryloopCustomizerControls ) ) {
if ( 'general' !== queryloopCustomizerControls.customize ) {
wp.customize.control( queryloopCustomizerControls.focus ).focus();
// agregamos ?document=1234 a la URL
wp.ajax.settings.url += '?document=' +
queryloopCustomizerControls.customize;
}
}
});
Intervenimos el guardado de
settings para guardar el nuestro
/**
* Si se provee el id del post, guardar post meta.
* @param mixed $valor Valor a guardar en el setting.
* @param WP_Customize_Setting $setting Instancia de WP_Customize_Setting.
*/
function queryloop_guardar_meta( $valor, $setting ) {
if ( isset( $_GET['document'] ) && ctype_digit( $_GET['document'] ) ) {
update_post_meta( $_GET['document'], $setting->id, $valor );
}
}
// wp-includes/class-wp-customize-setting.php
add_action( 'customize_update_ql_meta', 'queryloop_guardar_meta', 10, 2 );
Mostramos el meta guardado
$wp_customize->add_setting( 'un_meta_key', array(
'type' => 'ql_meta',
'default' => isset( $_GET['document'] ) ?
get_post_meta( $_GET['document'], 'un_meta_key', true ) : '',
'capability' => 'customize',
) );
$valor = get_post_meta( get_the_ID(), 'un_meta_key', true );
Usamos la propiedad ‘default’ para los controles
En la previsualización o front end final
¡Muchas
Gracias!
http://twitter.com/eliorivero
http://queryloop.com

Más contenido relacionado

La actualidad más candente

WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPressAsier Marqués
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
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.
 
Catia v5 ergonomic design analysis manual de usuario
Catia v5 ergonomic design analysis manual de usuarioCatia v5 ergonomic design analysis manual de usuario
Catia v5 ergonomic design analysis manual de usuarioJavier Villavicencio
 
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.
 
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.
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Asier Marqués
 
M. carrito d compra en phpfinal
M. carrito d compra en phpfinalM. carrito d compra en phpfinal
M. carrito d compra en phpfinalAbyliel Garcia
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Ignacio Martín
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPJavier Eguiluz
 
Curso AngularJS - 3. módulos y controladores
Curso AngularJS - 3. módulos y controladoresCurso AngularJS - 3. módulos y controladores
Curso AngularJS - 3. módulos y controladoresÁlvaro Alonso González
 
Integrando Game Center en iOS
Integrando Game Center en iOSIntegrando Game Center en iOS
Integrando Game Center en iOSmicroeditionbiz
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysqlI LG
 

La actualidad más candente (20)

Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 
WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPress
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Curso AngularJS - 5. rutas
Curso AngularJS - 5. rutasCurso AngularJS - 5. rutas
Curso AngularJS - 5. rutas
 
Php2
Php2 Php2
Php2
 
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
 
Catia v5 ergonomic design analysis manual de usuario
Catia v5 ergonomic design analysis manual de usuarioCatia v5 ergonomic design analysis manual de usuario
Catia v5 ergonomic design analysis manual de usuario
 
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
 
Angularjs Lógica de negocio
Angularjs Lógica de negocioAngularjs Lógica de negocio
Angularjs Lógica de negocio
 
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
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.
 
M. carrito d compra en phpfinal
M. carrito d compra en phpfinalM. carrito d compra en phpfinal
M. carrito d compra en phpfinal
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
 
Ajax
AjaxAjax
Ajax
 
Manual de programador sistema experto bovino online
Manual de programador   sistema experto bovino onlineManual de programador   sistema experto bovino online
Manual de programador sistema experto bovino online
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHP
 
Jacqueline nuñez pacco
Jacqueline nuñez paccoJacqueline nuñez pacco
Jacqueline nuñez pacco
 
Curso AngularJS - 3. módulos y controladores
Curso AngularJS - 3. módulos y controladoresCurso AngularJS - 3. módulos y controladores
Curso AngularJS - 3. módulos y controladores
 
Integrando Game Center en iOS
Integrando Game Center en iOSIntegrando Game Center en iOS
Integrando Game Center en iOS
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysql
 

Destacado

Desarrollando un producto de comunicación
Desarrollando un producto de comunicaciónDesarrollando un producto de comunicación
Desarrollando un producto de comunicaciónwpargentina
 
Diseño y maquetación para WordPress
Diseño y maquetación para WordPressDiseño y maquetación para WordPress
Diseño y maquetación para WordPresswpargentina
 
cwa-319-approved-rifle-river-wmp-compressed
cwa-319-approved-rifle-river-wmp-compressedcwa-319-approved-rifle-river-wmp-compressed
cwa-319-approved-rifle-river-wmp-compressedJosh Leisen
 
No Fear Non-Fiction 2012
No Fear Non-Fiction 2012No Fear Non-Fiction 2012
No Fear Non-Fiction 2012kmperry
 
WordPress para diseñadores: Taller
WordPress para diseñadores: TallerWordPress para diseñadores: Taller
WordPress para diseñadores: TallerDisonancias
 
Secozoom riflescope catalogue
Secozoom riflescope catalogueSecozoom riflescope catalogue
Secozoom riflescope catalogueYivonnie Yi
 
Signs it's time to re evalutate
Signs it's time to re evalutateSigns it's time to re evalutate
Signs it's time to re evalutateJhane Wilcox, MBA
 
Presentación informativa
Presentación informativaPresentación informativa
Presentación informativaGlace12
 
rêve de titi
rêve de titirêve de titi
rêve de titilaure5555
 

Destacado (17)

Desarrollando un producto de comunicación
Desarrollando un producto de comunicaciónDesarrollando un producto de comunicación
Desarrollando un producto de comunicación
 
Diseño y maquetación para WordPress
Diseño y maquetación para WordPressDiseño y maquetación para WordPress
Diseño y maquetación para WordPress
 
J@B_ cv
J@B_ cvJ@B_ cv
J@B_ cv
 
Learning Catalog 2016
Learning Catalog 2016Learning Catalog 2016
Learning Catalog 2016
 
cwa-319-approved-rifle-river-wmp-compressed
cwa-319-approved-rifle-river-wmp-compressedcwa-319-approved-rifle-river-wmp-compressed
cwa-319-approved-rifle-river-wmp-compressed
 
Unidad 6
Unidad 6Unidad 6
Unidad 6
 
No Fear Non-Fiction 2012
No Fear Non-Fiction 2012No Fear Non-Fiction 2012
No Fear Non-Fiction 2012
 
WordPress para diseñadores: Taller
WordPress para diseñadores: TallerWordPress para diseñadores: Taller
WordPress para diseñadores: Taller
 
Secozoom riflescope catalogue
Secozoom riflescope catalogueSecozoom riflescope catalogue
Secozoom riflescope catalogue
 
ME107_IC700nm_Poster_final
ME107_IC700nm_Poster_finalME107_IC700nm_Poster_final
ME107_IC700nm_Poster_final
 
Signs it's time to re evalutate
Signs it's time to re evalutateSigns it's time to re evalutate
Signs it's time to re evalutate
 
Anuario
Anuario Anuario
Anuario
 
leon
leonleon
leon
 
Presentación informativa
Presentación informativaPresentación informativa
Presentación informativa
 
rêve de titi
rêve de titirêve de titi
rêve de titi
 
comandos dos-ms-dos
comandos dos-ms-doscomandos dos-ms-dos
comandos dos-ms-dos
 
Saisir les Jeunes: portrait de consommateurs en puissance
Saisir les Jeunes: portrait de consommateurs en puissanceSaisir les Jeunes: portrait de consommateurs en puissance
Saisir les Jeunes: portrait de consommateurs en puissance
 

Similar a Customizer: configurando un sitio en tiempo real

Php y my sql con manejo de sesiones
Php y my sql con manejo de sesionesPhp y my sql con manejo de sesiones
Php y my sql con manejo de sesionescapo1988
 
Informe grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuencaInforme grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuencapaulcuenca9
 
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Juan Manuel
 
DocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En XmlDocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En XmlAntonio
 
Consultar estado
Consultar estadoConsultar estado
Consultar estadoLismirabal
 
Procesar estado
Procesar estadoProcesar estado
Procesar estadoLismirabal
 
Tips Bootstrap 3 en Drupal 7
Tips Bootstrap 3 en Drupal 7Tips Bootstrap 3 en Drupal 7
Tips Bootstrap 3 en Drupal 7SuperSoft
 
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
 

Similar a Customizer: configurando un sitio en tiempo real (20)

Javascript y AJAX en Wordpress
Javascript y AJAX en WordpressJavascript y AJAX en Wordpress
Javascript y AJAX en Wordpress
 
Curso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzadosCurso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzados
 
Presentacion YII
Presentacion YIIPresentacion YII
Presentacion YII
 
Jacqueline nuñez pacco
Jacqueline nuñez paccoJacqueline nuñez pacco
Jacqueline nuñez pacco
 
(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
Php y my sql con manejo de sesiones
Php y my sql con manejo de sesionesPhp y my sql con manejo de sesiones
Php y my sql con manejo de sesiones
 
Gonzalo lopez miranda
Gonzalo lopez mirandaGonzalo lopez miranda
Gonzalo lopez miranda
 
Informe grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuencaInforme grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuenca
 
EXAMEN
EXAMENEXAMEN
EXAMEN
 
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
 
Funciones
FuncionesFunciones
Funciones
 
Conceptos basicos en CakePHP
Conceptos basicos en CakePHPConceptos basicos en CakePHP
Conceptos basicos en CakePHP
 
Jquery para principianes
Jquery para principianesJquery para principianes
Jquery para principianes
 
J M E R L I N P H P
J M E R L I N P H PJ M E R L I N P H P
J M E R L I N P H P
 
DocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En XmlDocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En Xml
 
Consultar estado
Consultar estadoConsultar estado
Consultar estado
 
Procesar estado
Procesar estadoProcesar estado
Procesar estado
 
Tips Bootstrap 3 en Drupal 7
Tips Bootstrap 3 en Drupal 7Tips Bootstrap 3 en Drupal 7
Tips Bootstrap 3 en Drupal 7
 
Documentacion jhon elvis_quispe_gutierrez
Documentacion jhon elvis_quispe_gutierrezDocumentacion jhon elvis_quispe_gutierrez
Documentacion jhon elvis_quispe_gutierrez
 
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
 

Más de wpargentina

Mailén Knoblovits: Lo que marca la diferencia
Mailén Knoblovits: Lo que marca la diferenciaMailén Knoblovits: Lo que marca la diferencia
Mailén Knoblovits: Lo que marca la diferenciawpargentina
 
Andrés Villarreal: Depresión, Ansiedad y Otros Demonios
Andrés Villarreal: Depresión, Ansiedad y Otros DemoniosAndrés Villarreal: Depresión, Ansiedad y Otros Demonios
Andrés Villarreal: Depresión, Ansiedad y Otros Demonioswpargentina
 
Lucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPress
Lucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPressLucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPress
Lucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPresswpargentina
 
Otto Wald: Cómo preguntar (y lograr que te respondan) en un foro
Otto Wald: Cómo preguntar (y lograr que te respondan) en un foroOtto Wald: Cómo preguntar (y lograr que te respondan) en un foro
Otto Wald: Cómo preguntar (y lograr que te respondan) en un forowpargentina
 
Iván Briceño: Herramientas de SEO On-Page para WordPress
Iván Briceño: Herramientas de SEO On-Page para WordPressIván Briceño: Herramientas de SEO On-Page para WordPress
Iván Briceño: Herramientas de SEO On-Page para WordPresswpargentina
 
Javier Schvindlerman: Creando un plan de contenidos anual en 6 minutos
Javier Schvindlerman: Creando un plan de contenidos anual en 6 minutosJavier Schvindlerman: Creando un plan de contenidos anual en 6 minutos
Javier Schvindlerman: Creando un plan de contenidos anual en 6 minutoswpargentina
 
Spencer Cloud: Cömo Crear un Custom Post Type
Spencer Cloud: Cömo Crear un Custom Post TypeSpencer Cloud: Cömo Crear un Custom Post Type
Spencer Cloud: Cömo Crear un Custom Post Typewpargentina
 
Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?
Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?
Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?wpargentina
 
WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...
WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...
WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...wpargentina
 
Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...
Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...
Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...wpargentina
 
Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017)
 Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017) Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017)
Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017)wpargentina
 
Introducción a herramientas de Roots (José Debuchy, WCBA 2017)
 Introducción a herramientas de Roots (José Debuchy, WCBA 2017) Introducción a herramientas de Roots (José Debuchy, WCBA 2017)
Introducción a herramientas de Roots (José Debuchy, WCBA 2017)wpargentina
 
El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017)
 El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017) El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017)
El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017)wpargentina
 
7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017)
 7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017) 7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017)
7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017)wpargentina
 
Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017)
 Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017) Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017)
Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017)wpargentina
 
Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017)
 Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017) Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017)
Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017)wpargentina
 
WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017)
 WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017) WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017)
WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017)wpargentina
 
WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W...
 WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W... WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W...
WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W...wpargentina
 
Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar...
 Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar... Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar...
Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar...wpargentina
 
Plugins con React y la REST API (Elio Rivero, WCBA 2017)
 Plugins con React y la REST API (Elio Rivero, WCBA 2017) Plugins con React y la REST API (Elio Rivero, WCBA 2017)
Plugins con React y la REST API (Elio Rivero, WCBA 2017)wpargentina
 

Más de wpargentina (20)

Mailén Knoblovits: Lo que marca la diferencia
Mailén Knoblovits: Lo que marca la diferenciaMailén Knoblovits: Lo que marca la diferencia
Mailén Knoblovits: Lo que marca la diferencia
 
Andrés Villarreal: Depresión, Ansiedad y Otros Demonios
Andrés Villarreal: Depresión, Ansiedad y Otros DemoniosAndrés Villarreal: Depresión, Ansiedad y Otros Demonios
Andrés Villarreal: Depresión, Ansiedad y Otros Demonios
 
Lucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPress
Lucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPressLucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPress
Lucas Maglicic: Estadísticas de visita y/o Google Analytics con WordPress
 
Otto Wald: Cómo preguntar (y lograr que te respondan) en un foro
Otto Wald: Cómo preguntar (y lograr que te respondan) en un foroOtto Wald: Cómo preguntar (y lograr que te respondan) en un foro
Otto Wald: Cómo preguntar (y lograr que te respondan) en un foro
 
Iván Briceño: Herramientas de SEO On-Page para WordPress
Iván Briceño: Herramientas de SEO On-Page para WordPressIván Briceño: Herramientas de SEO On-Page para WordPress
Iván Briceño: Herramientas de SEO On-Page para WordPress
 
Javier Schvindlerman: Creando un plan de contenidos anual en 6 minutos
Javier Schvindlerman: Creando un plan de contenidos anual en 6 minutosJavier Schvindlerman: Creando un plan de contenidos anual en 6 minutos
Javier Schvindlerman: Creando un plan de contenidos anual en 6 minutos
 
Spencer Cloud: Cömo Crear un Custom Post Type
Spencer Cloud: Cömo Crear un Custom Post TypeSpencer Cloud: Cömo Crear un Custom Post Type
Spencer Cloud: Cömo Crear un Custom Post Type
 
Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?
Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?
Ximena Vinitzca: ¿Cómo generar una API key de Google Maps?
 
WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...
WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...
WordPress WPO: Consejos y Herramientas (Federico Álvarez - Meetup Bs. As. Oct...
 
Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...
Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...
Cómo convertí mi trabajo freelance en un negocio (Mercedes Bugarin - Meetup...
 
Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017)
 Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017) Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017)
Trabajo a distancia: retos y oportunidades (Karen Arnold, WCBA 2017)
 
Introducción a herramientas de Roots (José Debuchy, WCBA 2017)
 Introducción a herramientas de Roots (José Debuchy, WCBA 2017) Introducción a herramientas de Roots (José Debuchy, WCBA 2017)
Introducción a herramientas de Roots (José Debuchy, WCBA 2017)
 
El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017)
 El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017) El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017)
El soporte soporta tu negocio: caso de estudio de WPML (Otto Wald, WCBA 2017)
 
7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017)
 7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017) 7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017)
7 claves para romperla con tus contenidos digitales (Pablo Croci, WCBA 2017)
 
Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017)
 Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017) Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017)
Multisites: creando una red de sitios con WordPress (Pablo Capello, WCBA 2017)
 
Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017)
 Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017) Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017)
Protegiendo tu presencia web con WordPress (Mike Schroder, WCBA 2017)
 
WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017)
 WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017) WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017)
WordPress: una opción (no siempre) consciente (Ricardo Aiello, WCBA 2017)
 
WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W...
 WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W... WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W...
WordPress en el mercado editorial: dos casos de éxito (Miguel Lederkremer, W...
 
Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar...
 Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar... Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar...
Definiciones en desarrollo web: cómo trabajar sobre WordPress (Andrés Villar...
 
Plugins con React y la REST API (Elio Rivero, WCBA 2017)
 Plugins con React y la REST API (Elio Rivero, WCBA 2017) Plugins con React y la REST API (Elio Rivero, WCBA 2017)
Plugins con React y la REST API (Elio Rivero, WCBA 2017)
 

Último

02. Mr. Spencer (T.L. Sawn).pdf.libro de un señor
02. Mr. Spencer (T.L. Sawn).pdf.libro de un señor02. Mr. Spencer (T.L. Sawn).pdf.libro de un señor
02. Mr. Spencer (T.L. Sawn).pdf.libro de un señorkkte210207
 
Unidad V. Disoluciones quimica de las disoluciones
Unidad V. Disoluciones quimica de las disolucionesUnidad V. Disoluciones quimica de las disoluciones
Unidad V. Disoluciones quimica de las disolucioneschorantina325
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdfedwinmelgarschlink2
 
Las redes sociales en el mercado digital
Las redes sociales en el mercado digitalLas redes sociales en el mercado digital
Las redes sociales en el mercado digitalNayaniJulietaRamosRa
 
PPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjj
PPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjjPPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjj
PPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjjNachisRamos
 
Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdflauradbernals
 
TIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdf
TIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdfTIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdf
TIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdfLUZMARIAAYALALOPEZ
 

Último (7)

02. Mr. Spencer (T.L. Sawn).pdf.libro de un señor
02. Mr. Spencer (T.L. Sawn).pdf.libro de un señor02. Mr. Spencer (T.L. Sawn).pdf.libro de un señor
02. Mr. Spencer (T.L. Sawn).pdf.libro de un señor
 
Unidad V. Disoluciones quimica de las disoluciones
Unidad V. Disoluciones quimica de las disolucionesUnidad V. Disoluciones quimica de las disoluciones
Unidad V. Disoluciones quimica de las disoluciones
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf
 
Las redes sociales en el mercado digital
Las redes sociales en el mercado digitalLas redes sociales en el mercado digital
Las redes sociales en el mercado digital
 
PPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjj
PPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjjPPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjj
PPT-HISTORIA-6°-ABC.pptxjjjjjjjjjjjjjjjjjjjjjj
 
Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdf
 
TIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdf
TIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdfTIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdf
TIPOS DE LA PSICOPATOLOGÍA DE LA PERCEPCIÓN.pdf
 

Customizer: configurando un sitio en tiempo real

  • 1. WP Customizer Personalizando tu sitio en tiempo real Elio Rivero - http://queryloop.com WordCamp Buenos Aires 2015
  • 2. ¿Para qué implementar el Customizer? Para previsualizar instantáneamente cambios que afecten el front-end. (predefinidos)
  • 3. Inicializando el Customizer /** * Registrar paneles, secciones y controles para el Customizer. * @param object $wp_customize Instancia de WP_Customizer_Manager. */ function queryloop_customize_register( $wp_customize ) { // Iniciar panels, sections, controls y sus settings. } add_action( 'customize_register', 'queryloop_customize_register' );
  • 4. $wp_customize->add_panel( 'panel_id', array( 'title' => __( 'Un Panel', 'queryloop' ), ) ); $wp_customize->add_section( 'section_id', array( 'title' => __( 'Una Sección', 'queryloop' ), 'panel' => 'panel_id', ) ); $wp_customize->add_setting( 'setting_id', array( 'type' => 'theme_mod', // u 'option' 'default' => '', // Valor predeterminado 'transport' => 'refresh', // o postMessage para cambios instantáneos 'capability' => 'edit_theme_options', // capacidad necesaria 'sanitize_callback' => '', // sanear el valor a guardar en el setting 'sanitize_js_callback' => '', // sanear el valor a volcar a la página. ) ); $wp_customize->add_control( new WP_Customize_Control( $wp_customize, 'setting_id', array( 'label' => __( 'Un Control', 'queryloop' ), 'type' => 'text', // 'text' es el predeterminado así que no haría falta 'section' => 'section_id', 'settings' => 'setting_id', ) ) );
  • 5. Controles Previsualización is_admin() es true is_admin() es false
  • 6. Customizer puede usar distintos Settings option Options API https://codex.wordpress.org/Options_API theme_mod Theme Modification API https://codex.wordpress.org/Theme_Modification_API ¿Otros? (un wrapper de Options API)
  • 7. Para emplear el Customizer en Opciones persistentes e independientes del theme. Plugins $wp_customize->add_setting( 'settings[key]', array( 'type' => 'option', 'capability' => 'customize', // nueva capacidad en 4.0 - Trac #28605 ) );
  • 8. Le decimos al Customizer qué vista cargar y a dónde volver // http://ejemplo.com/wp-admin/customize.php $link = add_query_arg( array( // http://ejemplo.com/documents/ 'url' => urlencode( get_post_type_archive_link( 'document' ) ), // http://ejemplo.com/wp-admin/options-general.php?page=opciones_plugin 'return' => urlencode( add_query_arg( 'page', 'opciones_plugin', admin_url( 'options-general.php' ) ) ) ), admin_url( 'customize.php' ) ); // http://ejemplo.com/wp-admin/customize.php?url=URL&return=RETURN echo '<a href="' . esc_url( $link ) . '" class="button">' . __( 'Personalizar', 'queryloop' ) . '</a>';
  • 9. Agregamos un parámetro para saber que es una vista del plugin // http://ejemplo.com/wp-admin/customize.php?url=URL&return=RETURN&miplugin=true $link = add_query_arg( 'miplugin', 'true', $link ); Visible en los controles // http://ejemplo.com/documents/?document_id=true 'url' => urlencode( add_query_arg( ‘document_id', 'true', get_post_type_archive_link( 'document' ) ) ), Visible en la previsualización ¡Cuidado aquí que el nombre del parámetro no sea un post type!
  • 10. Mostramos sólo las secciones de nuestro plugin /** * Remueve todas las secciones salvo seccion_1 y seccion_2 de nuestro plugin. * @param bool Estado de la sección * @param object Sección a deshabilitar o no. * @return bool */ function queryloop_quitar_secciones( $active, $section ) { if ( isset( $_GET['document'] ) || ( is_singular( 'document' ) ) ) { if ( in_array( $section->id, array( 'seccion_1', 'seccion_2' ) ) ) { return true; } return false; } return true; } add_filter( ‘customize_section_active','queryloop_quitar_secciones', 10, 2 );
  • 11. Cargamos JavaScript para los controles /** * Cargamos scripts, sus dependencias y pasamos variables. */ function queryloop_cargar_js_controles() { wp_enqueue_script( 'queryloop-controles', UNA_URL . '/js/customizer- controls.js', array( 'customize-views' ) ); wp_localize_script( 'queryloop-controles', 'queryloopCustomizerControls', array( 'focus' => 'control_3', // id de un control ) ); } add_action( 'customize_controls_enqueue_scripts', array( $this, 'queryloop_cargar_js_controles' ) );
  • 12. Enfocamos un control específico (function($){ $(window).load(function(){ if ( ! _.isUndefined( queryloopCustomizerControls ) ) { wp.customize.control( queryloopCustomizerControls.focus ).focus(); } }); })(jQuery);
  • 13. JavaScript en la previsualización /** * Carga JavaScript y pasa variables en previsualización. * * @since 1.0.0 */ function queryloop_cargar_js_previa() { wp_enqueue_script( 'queryloop-customizer', UNA_URL . '/js/ql-customizer- preview.js', array( 'customize-preview' ) ); $estilos = array(); foreach ( queryloop_obtener_estilos() as $key => $style ) { $estilos['queryloop_settings[' . $key . ']'] = array( 'selector' => $style['css']['selector'], 'property' => $style['css']['property'], ); } wp_localize_script( 'queryloop-customizer', 'queryloopCustomizerPrevia', $estilos ); } add_action( 'customize_preview_init', 'queryloop_cargar_js_previa' );
  • 14. Cambios de CSS instantáneos if ( ! _.isUndefined( queryloopCustomizerPrevia ) ) { _.each( queryloopCustomizerPrevia, function(rule, key) { wp.customize( key, function( value ) { value.bind( function( valor ) { $( rule.selector ).css( rule.property, '' ); if ( valor ) { $( rule.selector ).css( rule.property, valor ); } }); }); }); } $wp_customize->add_setting( 'setting', array( ‘transport' => 'postMessage', ) );
  • 15. Usamos la personalización en el Front End $settings = get_option( 'queryloop_settings' ); if ( isset( $settings['mostrar_titulo_pagina'] ) ) { // mostrar el título de esta página } else { // no mostrar título } $mostrar_titulo = get_option( 'queryloop_setting_unico' ); if ( $mostrar_titulo ) { // mostrar el título de esta página } else { // no mostrar título }
  • 16. Añadimos CSS al front-end con wp_add_inline_style /** * Genera CSS y carga luego del estilo principal. */ function queryloop_agregar_estilo() { $css = ''; foreach ( queryloop_obtener_estilos() as $key => $style ) { $css .= queryloop_generar_css( $style['selector'], $style['property'], $key ); } if ( ! empty( $css ) ) { wp_add_inline_style( 'estilo-principal', $css ); } } add_action( 'wp_enqueue_scripts', 'queryloop_agregar_estilo' );
  • 17. Usar el Customizer para guardar Post Meta con un setting distinto de option y theme_mod $wp_customize->add_setting( 'un_meta_key', array( 'type' => 'ql_meta', 'capability' => 'customize', ) );
  • 18. Creamos el botón para personalizar nuestra entrada $permalink = get_the_permalink( $post->ID ); printf( __( '<a href="%s" class="button">Personalizar Documento</a>', 'queryloop' ), esc_url( add_query_arg( array( 'url' => urlencode( add_query_arg( array( 'document_id' => $post->ID ), $permalink ) ), 'return' => urlencode( add_query_arg( array( 'post' => $post->ID, 'action' => 'edit', ), admin_url( 'post.php' ) ) ), 'document' => $post->ID, ), admin_url( 'customize.php' ) ) ) );
  • 19. Pasamos a JavaScript el ID de la entrada a personalizar /** * Cargamos scripts con dependencias y pasamos variables. */ function queryloop_cargar_js_controles() { wp_enqueue_script( 'queryloop-controles', UNA_URL . '/js/customizer- controls.js', array( 'customize-views' ) ); wp_localize_script( 'queryloop-controles', 'queryloopCustomizerControls', array( 'focus' => 'control_3', 'customize' => isset( $_GET['document'] ) ? $_GET['document'] : ‘general', // id de la entrada a personalizar ) ); } add_action( 'customize_controls_enqueue_scripts', array( $this,
  • 20. Si estamos personalizando el post, alteramos la URL de AJAX $(window).load(function(){ if ( ! _.isUndefined( queryloopCustomizerControls ) ) { if ( 'general' !== queryloopCustomizerControls.customize ) { wp.customize.control( queryloopCustomizerControls.focus ).focus(); // agregamos ?document=1234 a la URL wp.ajax.settings.url += '?document=' + queryloopCustomizerControls.customize; } } });
  • 21. Intervenimos el guardado de settings para guardar el nuestro /** * Si se provee el id del post, guardar post meta. * @param mixed $valor Valor a guardar en el setting. * @param WP_Customize_Setting $setting Instancia de WP_Customize_Setting. */ function queryloop_guardar_meta( $valor, $setting ) { if ( isset( $_GET['document'] ) && ctype_digit( $_GET['document'] ) ) { update_post_meta( $_GET['document'], $setting->id, $valor ); } } // wp-includes/class-wp-customize-setting.php add_action( 'customize_update_ql_meta', 'queryloop_guardar_meta', 10, 2 );
  • 22. Mostramos el meta guardado $wp_customize->add_setting( 'un_meta_key', array( 'type' => 'ql_meta', 'default' => isset( $_GET['document'] ) ? get_post_meta( $_GET['document'], 'un_meta_key', true ) : '', 'capability' => 'customize', ) ); $valor = get_post_meta( get_the_ID(), 'un_meta_key', true ); Usamos la propiedad ‘default’ para los controles En la previsualización o front end final