Como añadir campos personalizados a cada elemento del menu

¿Alguna vez has tenido la necesidad de añadir campos personalizados a los elementos del menu? Parece que no hay una manera fácil y directa de hacerlo pero sí hay una manera.

He subido un script a github que te ayudará a conseguirlo.

Necesitarás incluir ambos archivos del repositorio en tu plugin o tema y llamar a uno de ellos, Menu.php, tal y como se indica en el ejemplo:

require_once dirname( __FILE__ ) . '/Menu.php';

Después solo necesitas construir el array de campos personalizados que necesitas y pasarlo como argumento del objeto Menu.

$fields = array(
        '_mycustom_field_1' => array(
            'label' => __( 'Custom field 1', 'domain' ),
            'element' => 'input',
            'sanitize_callback' => 'sanitize_text_field',
            'attrs' => array(
                'type' => 'text',
                ),
            ),
        '_mycustom_field_2' => array(
            'label' => __( 'Custom field 2', 'domain' ),
            'element' => 'select',
            'sanitize_callback' => 'sanitize_text_field',
            'options' => array(
                'option-1' => __( 'Option 1', 'domain' ),
                'option-2' => __( 'Option 2', 'domain' ),
                ),
            ),
        );
 
        // Menu Management custom fields.
        new \Lucymtc\Theme\Menu( $fields );

Probablemente necesites añadir estilo a través del css. Debajo de estas líneas puedes encontrar el ejemplo visual.
Espero que este script te sea de utilidad!

Añade funcionalidad a Contact Form 7

Puedes añadir funcionalidad extra en el plugin Contact Form 7 después de que tomen lugar algunas acciones, por ejemplo cuando un email se ha enviado correctamente.
Contact Form 7 dispara una serie de eventos JavaScript a los que puedes acceder fácilmente, aquí hay un ejemplo usando JQuery.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if( $('.wpcf7').length > 0 ) {
 
  $(document).on('spam.wpcf7', function () {
    console.log('submit.wpcf7 triggered!');
  });
 
  $(document).on('invalid.wpcf7', function () {
    console.log('invalid.wpcf7 triggered!');
  });
 
  $(document).on('mailsent.wpcf7', function () {
    console.log('mailsent.wpcf7 triggered!');
  });
 
  $(document).on('mailfailed.wpcf7', function () { 
    console.log('mailfailed.wpcf7 triggered!');
  });
}

Recursos y Herramientas para desarrollo WordPress

Puede que esta lista crezca o cambie con el tiempo.

GitHub updater
Plugin para permitir actualizaciones automáticas a tus plugins o themes alojados en GitHub o Bitbucket
https://github.com/afragen/github-updater

Developer
Plugin que te permitirá optimizar tu entorno de trabajo asegurándose de que tienes todos las herramientas esenciales y plugins instalados.
https://wordpress.org/plugins/developer/

Theme Check
Comprueba que el Theme sigue los últimos estándares y buenas prácticas de WordPress.
https://wordpress.org/plugins/theme-check/

Log Deprecated Notices
Hace un log del uso de archivos, funciones argumentos de funciones obsoletas. Identifica el lugar en las que estan siendo usadas y ofrece una alternativa si existe. También identifica el uso incorrecto de las funciones.
https://wordpress.org/plugins/log-deprecated-notices/

Monster Widget
Ofrece un método rápido y fácil para añadir todos los widgets del core en el sidebar para testear.
https://wordpress.org/plugins/monster-widget/

Debug Bar
El plugin añade un menu debug en la barra de administrador para mostrar información útil para la depuración de errores.
https://wordpress.org/plugins/debug-bar/

Lista de herramientas de validación de código
http://codex.wordpress.org/Validating_a_Website#HTML_-_Validation

Theme Framework: Hybrid Core
Esto no es un “parent theme”. Es un framework para crear tu propio theme.
https://github.com/justintadlock/hybrid-core

WP Test
Iportar contenido de ejemplo para test. El contenido contiene diferentes estilos, listas, mágenes flotantes, etc… para ver como reacciona todo tipo de contenido en el theme.
http://wptest.io/

Como añadir valores dinámicos a los campos de Contact Form 7

Contact Form 7 es un plugin estupendo para añadir formularios a tu sitio web, pero estos formularios contienen campos estáticos y existen ocasiones en las que necesitamos añadir campos con valores dinámicos como el ID del post en el que nos encontramos o variables PHP GET y POST.

Esta tarea es muy sencilla instalando el plugin Contact Form 7 Dynamic Text Extension

Este plugin añade dos tipos de campo adicionales a Contact Form 7, estos campos son Dynamic Text field y Dynamic Hidden field, el valor dinámico para un campo específico se genera a través de un shortcode.

The plugin has it’s own shortcodes integrated, but you can create your own.
El plugin viene ya con algunos shortcodes predefinidos, pero puedes crear los tuyos propios.

Voy a poner un ejemplo muy sencillo:

Vamos a suponer que queremos añadir un campo oculto cuyo valor debe ser el ID del post en el que nos encontramos.
Si creamos nuestro propio shortocode tendría esta pinta:

function cf7_add_post_id(){
 
    global $post;
    return $post->ID;
}
 
add_shortcode('CF7_ADD_POST_ID', 'cf7_add_post_id');

Y el campo dinámico en la configuración de nuestro formulario sería:

[dynamictext my-filed-name "CF7_ADD_POST_ID"]

La otra manera de hacerlo es usando los shortocdes integrados en el propio plugin.
En este caso queremos obtener el ID del post actual así que únicamente habría que añadir el campo dinámico en la configuración del formulario:

[dynamictext my-filed-name "CF7_get_post_var key='ID'"]

El plugin viene con shortocodes para GET, POST, blog info, post info, current URL, custom fields, current user info, referrer URL. Tienes todos los detalles en la página de wordpress.org

WP Import All, importa cualquier tipo de datos a tu sitio WordPress

wp-all-importWp All Import es un plugin estupendo para importar cualquier tipo de datos a tu sitio web WordPress.

Puedes importar XML, CSV/Excel, JSON, SQL y en cualquier estructura para posts, pages y custom post types

Con un sistema “drag and drop” muy simple y fácil de usar, sólo tienes que arrastrar la información que deseas e indicar a que campo de la base de datos corresponde.

Importará las imágenes y también es capaz de autodetectar los campos customizados para la tabla de postmeta.
Tienen una versión más avanzada que da soporte para Advanced Custom Fields y productos WooCommerce.

La versión gratuita es bastante limitada, no trabaja con imágenes y tampoco importa los campos customizados para la tabla postmeta, lo que probablemente se necesite en casi el 100% de los casos. Así que si no eres programador este plugin es una buena inversión.

Pondré un ejemplo de cuando este plugin puede ser muy práctico y bien rentabilizado. Imagina que gestionas (o uno de tus clientes gestiona) un portal de anuncios, inmobiliario o algo parecido, y que constantemente tienes que importar archivos con data de otros sitios web externos, y cada sitio externo te manda los datos en una estructura o formato diferentes. Este plugin es ideal ya que que puedes guardar los ajustes de cada importación como una plantilla, de tal modo que sólo necesitarás hacer los ajustes para importar los datos de un sitio X una sola vez. Después cada vez que importes un nuevo documento enviado por la misma fuente, sólo tendrás que subir dicho ducumento, seleccionar la plantilla guardada y listo!

Echa un vistazo al vídeo que tienen en su página de wordpress.org

Nota: Usé este plugin en una web que gestionaba anuncios clasificados done un usuario puede crear un anuncio y al crearlo recibe una notificación por email confirmando la creación del anuncio. Cuando hice una importación de un XML con 1000 anuncios asignados a un autor el servidor trató de enviar 1000 notificaciones por email. Asegúrate de tener las notificaciones por email deshabilitadas en un caso parecido.

Como modificar la lista de provincias para envios en WooCommerce

A través del filtro woocommerce_states que devuelve un array de estados o provincias podemos modificar la lista a nuestro antojo, simplemente añadiendo unas líneas de código en nuestro plugin o el archivo functions.php de nuestro theme.

Para los ejemplos que voy a poner aquí vamos a suponer que en los ajustes de WooCommerce hemos seleccionado España como país para los envíos.

add_filter('woocommerce_states', 'my_custom_states');
 
function my_custom_states( $states ) {
 
   // aquí el código para modificar el array $states
   return $states;
}

Por ejemplo si no realizaramos envios a Canarias, podemos eliminar la opción Santa Cruz de Tenerife del array de provincias de esta manera:

add_filter('woocommerce_states', 'my_custom_states');
 
function my_custom_states( $states ) {
 
   unset($states['ES']['TF']);
   return $states;
}

Para excluir una lista de provincias:

add_filter('woocommerce_states', 'my_custom_states');
 
function my_custom_states( $states ) {
 
	$exclude = array('TF','BU','SG','ML','NA','OR');
 
	foreach( $exclude as $item ) {
		unset($states['ES'][$item]);
	}
 
	return $states;
}

O si sólo realizamos envíos a 3 provincias:

add_filter('woocommerce_states', 'my_custom_states');
 
function my_custom_states( $states ) {
 
   $states = array(
     'B'  => 'Barcelona',
     'MU' => 'Murcia',
     'SG' => 'Segovia'
   );
 
   return $states;
}

Puedes encontrar toda la lista de provincias y sus códigos dentro del plugin de WooCommerce, esta es la ruta a dicho archivo: woocommerce/i18n/states/ES.php (junto con el resto de archivos para los demás países)

Como cargar plantillas desde un plugin

Los archivos de plantillas (templates) se usan comunmente en themes y child themes, pero también puedes cargar estos archivos desde un plugin.

No es demasiado complicado crear tu propio cargador de plantillas, pero puedes encontrar una clase en GitHub creada por Gary Jones, Gamajo_Template_Loader

Para usar esta clase:
1. Crea un archivo dentro de tu plugin y copia la clase Gamajo_Template_Loader.
2. Crea una subclase de Gamajo_Template_Loader. Aquí tienes un ejemplo de esta subclase
3. Sobreescribe las propiedades de la clase para que se ajusten a tu plugin, dichas propiedades son : $filter_prefix, $theme_template_directory, $plugin_directory.

También puedes encontrar un ejemplo de un plugin completo utilizando Gamajo_Template_Loader creado por Pippin Williamson de pippinsplugins.com