En la Parte 1 y la Parte 2 de nuestra serie de tutoriales de plantillas de meta box personalizadas, aprendimos cómo crear una matriz de campos para recorrer y crear una meta box personalizada con sus campos estándar. Ahora vamos a agregar un poco de JavaScript para algunos campos elegantes, pero muy útiles.
Cada uno de los campos que cubrimos en este tutorial requerirá jQuery y la interfaz de usuario de jQuery. Afortunadamente, WordPress hace que sea muy fácil de usar con wp_enqueue_script
, y a partir de 3.3, todas las interacciones de la interfaz de usuario de jQuery y los widgets se incluyen con WordPress.
Ya que estamos trabajando en una página que ya pone en cola jQuery, podemos omitir eso, pero necesitaremos obtener el jQuery UI Datepicker. También necesitaremos crear nuestra propia hoja de estilo ya que el CSS necesario no viene incluido en WordPress todavía, aunque están trabajando en eso.
if (is_admin ()) wp_enqueue_script ('jquery-ui-datepicker'); wp_enqueue_style ('jquery-ui-custom', get_template_directory_uri (). '/ css / jquery-ui-custom.css');
Solo necesitamos cargarlos en el administrador, y no en la parte delantera del sitio, así que envuelva las funciones de forma condicional. La primera función llama al selector de fechas y también cargará el núcleo de la interfaz de usuario de jQuery. La segunda función llamará a nuestra hoja de estilo jquery-ui-custom.css desde la carpeta css del tema. La hoja de estilo de ejemplo incluida en la descarga al principio de este tutorial no requiere imágenes. También puedes crear tu propio tema de jQuery UI.
Ahora veamos el elemento de matriz que necesitamos agregar a nuestro $ custom_meta_fields
matriz comenzamos en la parte 1.
array ('label' => 'Date', 'desc' => 'Una descripción para el campo.', 'id' => $ prefix.'date ',' type '=>' date ')
Esta matriz es casi idéntica a nuestro elemento de texto. Tiene una etiqueta principal, una descripción, una identificación única y el tipo de fecha está definido. Simplemente vamos a ir con una implementación básica del selector de fecha en nuestro ejemplo aquí, pero si necesita mejorar su uso del selector de fecha, también puede agregar otra información a la matriz, como el formato preferido, la localización , y rango de fechas para nombrar unos pocos. Luego, puede usar esa información en el siguiente llamador de script que necesitamos agregar al encabezado de la página:
add_action ('admin_head', 'add_custom_scripts'); function add_custom_scripts () global $ custom_meta_fields, $ post; $ output = ''Este bit debe agregarse fuera de la
$ custom_meta_fields
matriz y fuera de lashow_custom_meta_box
función de devolución de llamada para inicializar el selector de fecha en todos los campos con la clase de "selector de fecha".// fecha caso 'fecha': eco '
'. $ field [' desc '].''; descanso;Este código se agregará después de la última "interrupción" en nuestro modificador de meta caja.
A veces es necesario recopilar un número que se establece en un rango exacto o debe ser múltiplos de 5. El control deslizante de la interfaz de usuario de jQuery es ideal para esto porque hace que sea fácil arrastrar y deslizar hasta el número que desea ingresar.
wp_enqueue_script ('jquery-ui-slider');
Asegúrese de llamar al archivo js agregando esto a sus colas envueltas de is_admin ().
array ('label' => 'Slider', 'desc' => 'Una descripción para el campo.', 'id' => $ prefix.'slider ',' type '=>' slider ',' min '= > '0', 'max' => '100', 'paso' => '5')
Una vez más, estamos agregando esto a nuestro $ custom_meta_fields
matriz y hay algunas adiciones especiales.
if ($ field ['type'] == 'slider') $ value = get_post_meta ($ post-> ID, $ field ['id'], true); if ($ value == ") $ value = $ field ['min']; $ output. = 'jQuery (" #'. $ field ['id'] .'- slider ") .slider (value: ' . $ value. ', min:'. $ field ['min']. ', max:'. $ field ['max']. ', step:'. $ field ['step']. ', deslice: función (evento, ui) jQuery ("# '. $ field [' id '].'") .val (ui.value);); ';
Agrega este bit de código al bucle en el add_custom_scripts
Función que creamos en el último tipo de campo. Esto agregará el jQuery personalizado que necesitamos para configurar el control deslizante.
// slider case 'slider': $ value = $ meta! = "? $ meta: '0'; echo '
'. $ field [' desc '].''; descanso;
Nuevamente, solo estamos usando un campo de texto para recibir el valor del control deslizante.
Desde la introducción de Miniaturas de Publicaciones, configurar una imagen con un meta campo personalizado no es algo que hagamos mucho, pero de vez en cuando llega un momento en que necesita configurar una imagen que no sea la miniatura de la publicación, especialmente al crear una complemento que tiene en cuenta que es posible que el tema del usuario no admita la publicación de miniaturas.
Este campo agregará la capacidad de cargar una imagen o seleccionar una de la carga de medios, mostrar una vista previa de la imagen y guardar la ID para opciones de uso máximo.
Para obtener nuestro botón para activar el cargador de medios, debemos vincularlo con un poco de javascript.
jQuery (function (jQuery) jQuery ('. custom_upload_image_button'). click (function () formfield = jQuery (this) .siblings ('. custom_upload_image'); preview = jQuery (this) .siblings ('. custom_preview_image') ; tb_show (", 'media-upload.php? type = image & TB_iframe = true'); window.send_to_editor = function (html) imgurl = jQuery ('img', html) .attr ('src'); classes = jQuery ('img', html) .attr ('clase'); id = classes.replace (/(.*?) wp-image- /, "); formfield.val (id); preview.attr ('src' , imgurl); tb_remove (); return false;); jQuery ('. custom_clear_image_button'). click (function () var DefaultImage = jQuery (this) .parent (). siblings ('. custom_default_image'). text (); jQuery (this) .parent (). siblings ('. custom_upload_image'). val ("); jQuery (this) .parent (). siblings ('. custom_preview_image'). attr ('src', defaultImage) ; falso retorno; ); );
Póngalos en un archivo js personalizado y póngalos en cola dentro de las colas envueltas de is_admin ().
wp_enqueue_script ('custom-js', get_template_directory_uri (). '/ js / custom-js.js');
La primera función encuentra el botón que vamos a crear pronto con la clase de "custom_upload_image_button '" y preforma algunas cosas diferentes al hacer clic.
La segunda función le dice al enlace que clasificaremos como "custom_clear_image_button" para borrar el valor del campo de formulario y restablecer la vista previa a nuestra imagen predeterminada.
array ('name' => 'Image', 'desc' => 'Una descripción para el campo.', 'id' => $ prefix.'image ',' type '=>' image ')
Solo necesitamos la información básica para este campo..
// imagen del caso 'image': $ image = get_template_directory_uri (). '/ images / image.png'; eco ''. $ imagen'.'; if ($ meta) $ image = wp_get_attachment_image_src ($ meta, 'medium'); $ imagen = $ imagen [0]; eco '
Quita la imagen
'. $ field [' desc '].''; descanso;
Tenemos algunas cosas que están sucediendo aquí, pero con la forma en que escribimos el javascript, esto debería funcionar bastante bien, sin importar cuántos campos de imagen agregue..
Cuando realmente comiences a usar metacampos personalizados para almacenar varios tipos de datos para una publicación, eventualmente te encontrarás con la necesidad de tener varias instancias del mismo campo. Con un poco de javascript, puede duplicar fácilmente un campo tantas veces como lo necesite, e incluso ordenarlos con arrastrar y soltar. Hay muchas maneras en que podemos usar esta funcionalidad, pero para nuestro ejemplo solo vamos a usar una entrada de texto básica.
jQuery ('. repeatable-add'). click (function () field = jQuery (this) .closest ('td'). find ('. custom_repeatable li: last'). clone (true); fieldLocation = jQuery ( this) .closest ('td'). find ('. custom_repeatable li: last'); jQuery ('input', campo) .val ("). attr ('name', function (index, name) return name .replace (/ (\ d +) /, function (fullMatch, n) return Number (n) + 1;);) field.insertAfter (fieldLocation, jQuery (this) .closest ('td')) devuelve false ;); jQuery ('. repeatable-remove'). click (function () jQuery (this) .parent (). remove (); return false;); jQuery ('. custom_repeatable'). sortable ( opacidad: 0.6, revertir: verdadero, cursor: 'mover', manejar: '.sort');
Puedes agregar este javascript a los js personalizados que ya creaste en el último paso.
La primera función busca el botón Agregar y agrega una nueva fila de campo en blanco al final de la lista de campos. Esto se configura genéricamente para que pueda tener tantos de estos campos repetibles como sea necesario..
La siguiente función le da a cada botón de eliminar la capacidad de eliminar esa fila cuando se hace clic.
Finalmente, configuramos las listas para que puedan ordenarse y definimos un controlador para que pueda arrastrar y soltar las filas. No es necesario poner en cola la interacción clasificable de la interfaz de usuario jQuery porque ya se está utilizando en la página de publicación de edición.
array ('label' => 'Repeatable', 'desc' => 'Una descripción para el campo.', 'id' => $ prefix.'repeatable ',' type '=>' repetible ')
No hay nada especial acerca de este campo en la matriz para nuestro ejemplo. Sin embargo, podría volverse bastante loco aquí y agregar opciones para qué tipo de campos se usan en la lista repetible.
// caso repetible 'repetible': echo '+
Este campo requiere un bucle si hay guardado un metainvalor, y ningún bucle si no existe.
.$ i
entero para asegurarse de que se agregue un nuevo número a la matriz de nombres.Si has seguido las tres partes de esta serie hasta ahora, tu caja final debería parecerse a la que se muestra aquí:
En realidad, solo hemos arañado la superficie de lo que se puede hacer con este método de construcción de una plantilla de meta caja personalizada reutilizable. Cuanto más agregue a su plantilla, más fácil será colocarlo en cualquier proyecto en el que esté trabajando para hacer que el tiempo que dedique a la codificación sea más rápido y para agilizar el proceso con un código limpio y consistente..