¿Cómo pasar atributos desde PHP a JavaScript en WordPress?
La conexión entre PHP y JavaScript es crucial para muchos desarrolladores de WordPress, ya que permite enviar datos del servidor al cliente de forma eficiente. En esta guía, aprenderás a pasar atributos desde PHP a JavaScript utilizando las funciones adecuadas para garantizar una interacción fluida en tu proyecto.
¿Qué función utilizamos para enviar datos de PHP a JavaScript?
En WordPress, utilizamos la función wp_localize_script() para enviar información a scripts JavaScript:
functionmi_funcion_custom_scripts(){// ... Registro de estilos y scripts ...wp_localize_script('handle-del-script',// Nombre del script registrado'nombreObjetoJS',// Nombre del objeto JavaScriptarray('propiedad'=>'valor'));}
Primer parámetro: El nombre del script JavaScript al que le estás adjuntando los datos.
Segundo parámetro: El nombre del objeto JavaScript que contendrá los datos.
Tercer parámetro: Un array con los datos que deseas pasar al script JavaScript.
¿Cómo definir y enviar datos con JSON?
Para definir la información que se enviará y procesarla en JavaScript, puedes utilizar el formato JSON:
Definición del objeto de datos:
let data ={accion:'nombre_funcion_php',categoria:$('#miSelector').val()};
Enviar el dato al servidor: La función $.ajax es útil en este contexto para gestionar peticiones asíncronas.
$.ajax({url: objetoGlobalJS.miURL,method:'POST',data: data,beforeSend:function(){$('#idElemento').html('Cargando...');},success:function(response){// Procesar la respuesta},error:function(error){console.error(error);}});
¿Cómo definir y registrar un endpoint en PHP?
Para recibir y procesar la solicitud Ajax en el servidor, define la función PHP y regístrala usando las acciones de WordPress:
functionmi_funcion_php(){// Lógica del filtrado de productos o similar$resultado=array();// Array con los resultadoswp_send_json_success($resultado);}add_action('wp_ajax_nombre_funcion_php','mi_funcion_php');add_action('wp_ajax_nopriv_nombre_funcion_php','mi_funcion_php');
Acción wp_ajax_: Registra el gancho para usuarios autenticados.
Acción wp_ajax_nopriv_: Registra el gancho para usuarios no autenticados.
¿Cómo procesar y mostrar los datos en JavaScript?
Una vez que tienes los datos de vuelta en JavaScript, como una respuesta JSON, crea la lógica para mostrar los datos en tu interfaz de usuario:
let html ='';data.forEach(function(item){ html +=`<div class="col-4 mb-3">
<figure>
<img src="${item.imagen}" alt="${item.titulo}" />
</figure>
<h4>${item.titulo}</h4>
<a href="${item.link}" title="${item.titulo}">Ver Producto</a>
</div>`;});$('#idContenedor').html(html);
¿Qué hacer en caso de errores en AJAX y cómo corregirlos?
Los errores pueden surgir por diversas razones, como la falta de parámetros. Para identificar y corregir estos errores:
Inspeccionar la consola: Verifica mensajes de error que pueden dar pistas sobre parámetros faltantes o errores de sintaxis.
Revisar las funciones PHP y AJAX: Asegúrate de que los datos se están enviando y recibiendo correctamente.
Con esta guía, ahora dispones de las herramientas necesarias para gestionar la interacción entre PHP y JavaScript en WordPress con confianza. A medida que profundices, descubrirás más funcionalidades y posibilidades, ¡continúa aprendiendo y explorando!
Saludos a todos,
Seguí los pasos de la clase y me da un “Fatal error: Cannot use empty list in …\Platzigifts\wp-content\themes\platzigifts\functions.php on line 121
Ha habido un error crítico en tu web.”
El código es:
functionpgFiltroProductos(){ $args =array('post_type'=>'producto','posts_per_page'=>-1,'order'=>'ASC','orderby'=>'title');if($_POST['categoria']){ $args['tax_query']=array(array('taxonomy'=>'categoria-productos','field'=>'slug','terms'=> $_POST['categoria']));} $productos =newWP_Query($args);if($productos->have_posts()){ $return=array();while($productos->have_posts()){ $productos->the_post();return[]=array('imagen'=>get_the_post_thunbnail(get_the_id(),'large'),'link'=>get_the_permalink(),'titulo'=>get_the_title()// Aquí es la línea 121);}wp_send_json($return);};}add_action("wp_ajax_nopriv_pgFiltroProductos","pgFiltroProductos");add_action("wp_ajax_pgFiltroProductos","pgFiltroProductos");?>
No encuentro la pestaña “Archivos y Enlaces” para verificar el código, si lo tienen tal como está en la clase me lo alcanzan para comparar, gracias.
Hola Raúl, cómo estás?
Te dejo el link al repo para que puedas revisarlo.
Por el error creo que no se debe estar enviando bien el valor seleccionado en el select desde el JS.
Espero que te sirva y cualquier consulta, no dudes en volver a escribir.
Saludos!
Profesor, buenos días todo bien, pero creo que el repositorio está en su estado inicial, no encuentro la parte en la que se implementan las categorías en "functions.php" para hacer la comparación y el archivo "custom.js" tiene solamente el "console.log('Hola WordPress');" . Ya estuve revisando el vídeo y no encuentro el error. Saludos.
Por favor subir los archivos del curso para poder tener el código como referencia y corregir los errores que se nos presentan
Hola Sebastián, cómo estás?
Acá te dejo el link al repo y una captura para que sepas cómo revisar el código de cada clase.
Saludos!
Muchas gracias
Si que estaba de manco. En mi caso tube un error ya que estoy utilizando Bootstrap 5, que no utiliza jquery asi que nunca lo agregue al proyecto, simplemente fue agregarlo en el archivo functions.php. y listo.
Hola, el proyecto en github esta super diferente a como se presenta en las clases tanto en los nombre de las funciones como en las estructuras.
Si no les funciona la invocacion del archivo custom.js, cuando hagan el cambio tienen que cambiar la version en el archivo functions.php
Hola Alejandro, cómo estás?
Este es el reto y está en el tag de la última clase, donde está el código del proyecto.
Saludos!
Todo perfectamente claro. Gracias
Tengo una duda, si tengo múltiples funciones ajax, debo crear diferentes wp_localize_script para que cada uno tenga los parámetros de cada función ajax?
Hola Giselle, cómo estás?
Los wp_localize enviarán la información al archivo que le indiques, por lo tanto si tus funciones están en el mismo archivo, podrías enviar uno solo. Lo importante es que si haces más de un localize por archivo pueden anularse y que solo recibas una parte de los datos. Es por esto que preferentemente se dividen las funciones en archivos más pequeños y se hacen los localiza necesarios apra cada uno.
Saludos!
Alguien me diría si se debe instalar JQuery o algo así??
Es que coloco todo tal cual lo explica el profe y no hace nada, ni error tira; literalmente no hace nada.
DEBUG,
@whoisnegrello cómo podemos hacer debuging el codigo de php? me retorna null la funcion ajax :-(
Este artículo te puede ayudar a mostrar los errores de PHP.
Hola Coco, cómo estás?
Para poder testear las funciones AJAX lo mejor es utilizar la función wp_send_json() en diferentes lugares, retornando diferentes partes del código y hacer console.log de cada parte para testear paso a paso.
Saludos!
El repositorio está desactualizado y a pesar de que muchos lo han dicho no hicieron nada, ademas que según veo no hay respuesta del instructor desde hace casi un año.
Hola Carlos, cómo estás?
El repositorio no está desactualizado, solo tenés que avanzar por medio de los tags apra ir viendo los cambios clase a clase.
Acá te dejo el link para que puedas ver el código final.
En el caso de que tengas dudas, será un gusto responderlas. Solo tenés que dejarlas en la sección de preguntas.
Saludos!
DUrante esta clase he tenido problema debido a algunos cambios en el codigo que han habido. Trate de revisar por los documentos en github pero en el repositorio habia muchas lineas distintas. Por lo que decidi ver las clases varias veces para entender mejor el codigo**(Recomendado que lo hagan con todas las clases)**. Y vi como colocaron clases y Id en algunos div. Las cuales nunca explicaron, solamente aparecieron de repente. Se que esta clase tiene ya unos cuantos años subidos pero me parece raro y de mal gusto que a pesar de que pasan los años no se han percatado de eso o tratado de arreglar con nuevas clases o explicandolo mejor a traves de un repositorio.
Sin duda alguna platzi es una de las mejores plataformas para estudiar sobre nuevas tecnologia pero tienen que seguir mejorando en estas cosas que a simple vista es un error que se pudo haber evitado con un pequeña y minima atencion y asi evitar tanta confunsion entre los estudiantes. Por ejemplo yo dure alrededor de 3 dias en poder saber porque me equivocaba, pero todo es parte del proceso. Espero que puedan tomar esto como una critica constructiva y no como algo personal contra el profesor o la plataforma (OjO que el profesor me ha gustado como ha explicado en las ultimas clase)
Me sucedió algo, toda la parte del filtrado ocurría sin problemas, pero a la hora de imprimir el HTML no se ejecutaba. Me di cuenta que era porque me faltaba el elemento contenedor donde se imprimen los resultados:
<div id="resultado-productos"></div>
De modo que el html del front-page.php queda de esta forma:
<div class="row"><div class="col-12"><select class="form-control" name="categorias-productos" id="categorias-productos"><option value="">Todas las categorias</option><?php $terms =get_terms('categoria-productos',array('hide_empty'=>true));?><?php foreach($terms as $term){ echo '<option value="'.$term->slug.'">'.$term->name.'</option>';}?></select><div id="resultado-productos"></div></div></div>
Esta un poco cutre, pero se puede mejorar :)
Hola, mi filtro me muestra todos los productos en todas las opciones donde puedo tener el error, adjunto el codigo:
/custom.js
console.log('Hola WordPress');
(function($) {
$('#categorias-productos').change(function(){
$.ajax({
url:pg.ajaxurl,
method:"POST",
data:{
"action":"pgFiltroProductos",
"categoria":$(this).find(':selected').val()
},
beforeSend: function(){
$("#resultado-productos").html("cargando...")
Hola Adriana, cómo estás?
Habría que ver tu archivo PHP, porque en principio veo que por acá pareciera todo correcto. Si querés subilo a un repositorio así es más fácil de revisar todo el código.
Saludos!
Hola Adriana, resolviste el problema? tengo el mismo inconveniente
Hola, tengo un error 400, he revisado el código muchas veces y no lo he logrado solucionar
Hola, compañeros, ya logré solucionar el error, todo se debe a que me he confundido en los nombres de la función, ya que he cambiado por los nombres de mi proyecto personal en el function.php al declarar la función y no he tenido en cuenta los mismos nombres en el archivo custom.js
Hola alguno de los que estan viendo esta clase ahora tendra el repo del proyecto acttualizado?
Hola Jesús, cómo estás?
Este es el link al repo con el código final.
Saludos!
Tienen el repositorio actualizado??
Hola, cómo estás?
En este link está el estado final del proyecto.
Podés ir viendo clase por clase desde los tags de Github.
Saludos!
Hola, podrian decirme donde sale el valor de categoria? Yo estoy creando un filtro pero con el post_type de wordpress es decir el de entrada y con las categorias por defecto. pero a la hora de filtrar solo me carga todo los posts
Hola Rubén, cómo estás?
En esta clase, vemos como crear el filtro de categorías, que es desde dónde tomamos el valor de las mismas para la función AJAX.
En el caso de estar haciendolo con los posts y las categorías por defecto, el valor de la taxonomía es "category".
Saludos!
muchas gracias!
Buenas tardes, alguien sabe como cargar más post mediante un boton Load More vía AJAX.
Hola Julio, cómo estás?
Eso lo podés ahcer con AJAX, pero tendrías que usar más elementos de la API.
Hay una de las propiedades que es "page" eso indica según el paginado, cuál sería el pedido siguiente. Entonces lo que tendrías que hacer el repetir el pedido pero a la página siguiente cuando se presione el botón y agregar el parámetro de la página correspondiente.
Acá te comparte el link a la documentación donde podés ver todas las propiedades que podés usar.
Saludos!