Empezar
Cómo modificar la salida del escritor de feeds con filtros - AdTribes
  1. Inicio
  2. Base de conocimientos
  3. Personalización
  4. Cómo modificar la salida del escritor de feeds con filtros

Cómo modificar la salida del escritor de feeds con filtros

Esta es una referencia para desarrolladores. Asume que te sientes cómodo agregando código a través de un plugin personalizado o el archivo functions.php de tu tema. Si eres nuevo en los ganchos de WordPress, lee primero el Manual de Plugins de WordPress sobre ganchos.

La pestaña Mapeo de Campos cubre la mayoría de las necesidades de personalización de feeds, pero a veces necesitas cambiar algo que no puede alcanzar: envolver un valor en un nodo XML personalizado, reestructurar una columna CSV que no está expuesta como un atributo, o reescribir la fila de encabezado para un sistema posterior. Product Feed Pro dispara un conjunto de ganchos de filtro dentro de sus escritores XML, CSV y TSV exactamente para esto. Engánchate a ellos desde un plugin personalizado, y puedes cambiar lo que realmente se escribe en el archivo de feed, sin tocar el núcleo del plugin.

Este artículo cubre los filtros a nivel de escritor y ejemplos de código que funcionan para cada uno. Para el catálogo completo de ganchos del plugin, incluidos los ganchos fuera de los escritores de feeds, consulta Ganchos y filtros disponibles en Product Feed Pro.

Estos son ganchos de filtro de PHP, no son lo mismo que la pestaña Filtros del plugin. La pestaña Filtros te permite incluir o excluir productos de un feed usando condiciones en la interfaz de usuario. Para esa función, consulta Cómo crear filtros para tu feed de productos.

Prerrequisitos

RequisitoDetalles
PluginProduct Feed Pro, versión 13.5.7 o posterior
Dónde agregar códigoUn plugin personalizado (específico del sitio), o el archivo functions.php de tu tema activo si no estás usando un tema hijo
Habilidades necesariasComodidad escribiendo PHP y registrando ganchos de filtro de WordPress

Cómo funciona el escritor de feeds

Product Feed Pro utiliza un escritor para feeds XML y un escritor compartido para feeds CSV y TSV (TSV utiliza la misma ruta de código que CSV, solo que con un carácter de tabulación como delimitador). Durante la generación del feed, el plugin consulta un lote de productos, construye los datos de cada producto y luego entrega esos datos al escritor para el formato del feed. Los filtros a continuación se encuentran dentro de ese paso de escritura: se ejecutan una vez por producto, o una vez por ejecución de generación de feed para los ganchos de encabezado y enlace de canal. Debido a que se activan durante la salida del escritor, los cambios realizados aquí solo se aplican al formato al que se dirigen. Un filtro en el escritor XML no afecta a un feed CSV, y viceversa.

Filtros de feed XML

adt_product_feed_xml_attribute_value: Filtra el valor de un solo atributo XML justo antes de que se escriba en el nodo XML del producto. Úsalo para cambiar la salida de un atributo para feeds XML sin tocar ningún otro atributo o formato.

add_filter( 'adt_product_feed_xml_attribute_value', 'my_custom_xml_attribute_value', 10, 5 );
function my_custom_xml_attribute_value( $value, $key, $product, $product_data, $feed ) {
    if ( 'title' === $key ) {
        $value = strtoupper( $value );
    }
    return $value;
}

$key es la clave del atributo que se está escribiendo (por ejemplo, title), $product es el nodo SimpleXMLElement que se está construyendo, y $product_data es el array completo de datos del producto para esa fila. Devuelve el valor que deseas que se escriba para ese atributo.

adt_product_feed_xml_attribute_handling: Un filtro de cortocircuito que le permite encargarse de cómo se escribe un atributo en XML por completo, en lugar de simplemente cambiar su valor. Devuelva true para indicar al plugin que omita su propio manejo para ese atributo. Su callback es entonces responsable de escribir el nodo en $product mismo.

add_filter( 'adt_product_feed_xml_attribute_handling', 'my_custom_xml_attribute_handling', 10, 7 );
function my_custom_xml_attribute_handling( $handled, $product, $key, $value, $feed_config, $channel_attributes, $feed ) {
    if ( 'custom_label' !== $key ) {
        return $handled;
    }
    $product->addChild( 'g:custom_label_0', esc_html( $value ) );
    return true;
}

Si devuelve true desde adt_product_feed_xml_attribute_handling pero no escribe nada en $product, ese atributo se elimina silenciosamente del feed. Devuelva true solo una vez que su callback haya agregado el nodo.

adt_pfp_google_shopping_feed_channel_link y adt_pfp_feed_channel_link: Filtra la URL a nivel de canal escrita en la cabecera del feed. La primera se aplica a los feeds en la taxonomía de Google Shopping, donde establece <link> dentro de <channel>. La segunda se aplica a Yandex, Zap.co.il, Salidzini.lv y Pinterest RSS Board, y el elemento difiere según el formato: Yandex escribe <url> dentro de <shop>, Zap.co.il y Salidzini.lv escriben <link> en la raíz del documento, y Pinterest RSS Board escribe <link> dentro de <channel>. Ambas reciben la URL de inicio del sitio y el feed que se está generando, y ambas deben devolver una cadena de URL.

add_filter( 'adt_pfp_feed_channel_link', 'my_custom_feed_channel_link', 10, 2 );
function my_custom_feed_channel_link( $link, $feed ) {
    return trailingslashit( $link ) . 'shop/';
}

Filtros de feeds CSV y TSV

adt_product_feed_csv_header: Filtra la cadena de la fila de encabezado justo antes de que se escriba como la primera línea de un feed CSV o TSV. Se activa una vez, en el primer lote de una ejecución de generación de feed.

add_filter( 'adt_product_feed_csv_header', 'my_custom_csv_header', 10, 3 );
function my_custom_csv_header( $header, $feed_attributes, $feed ) {
    return str_replace( "'id'", "'sku'", $header );
}

adt_product_feed_csv_row_data: Filtra la matriz de valores de celda que componen una sola fila CSV o TSV, justo antes de que se escriba en el archivo del feed. Este es el filtro al que recurrir cuando necesite remodelar o recalcular un valor que solo se aplica a la salida CSV/TSV.

add_filter( 'adt_product_feed_csv_row_data', 'my_custom_csv_row_data', 10, 4 );
function my_custom_csv_row_data( $pieces_row, $old_attributes_config, $product_data, $feed ) {
    foreach ( $pieces_row as $index => $value ) {
        $pieces_row[ $index ] = trim( $value );
    }
    return $pieces_row;
}

$pieces_row es una matriz simple de los valores de celda de la fila en orden de columna, coincidiendo con la fila de encabezado de adt_product_feed_csv_header. Debido a que TSV comparte esta misma ruta de código, una devolución de llamada agregada aquí se ejecuta para ambos formatos. Si necesita un comportamiento específico del formato, verifique el formato de archivo del feed en $feed dentro de su devolución de llamada.

La corrección de lotes vacíos

Las versiones de Product Feed Pro anteriores a la 13.5.5 tenían un error por el cual un feed CSV con un lote vacío (una ejecución de generación que devolvía cero productos) podía activar la lógica de validación XML y abortar con un error de "xml no válido", a pesar de que el feed nunca pretendía generar XML. El lote vacío fallaba la comprobación de si hay productos de la rama CSV y caía en la rama XML, que luego intentaba escribir y validar el feed CSV como XML. La versión 13.5.5 restringió esa rama XML a los feeds cuyo formato es realmente XML, por lo que un lote CSV o TSV vacío ahora no escribe nada y ya no puede ser enrutado a través de la validación exclusiva para XML. Si estás en la versión 13.5.5 o posterior, esto no puede volver a ocurrir. Si estás en una versión anterior, actualiza el plugin antes de confiar en cualquiera de los filtros de este artículo.

Probando tus cambios de forma segura

  • Usa primero un sitio de staging. Prueba los filtros a nivel de escritor en un lugar donde un feed defectuoso no afecte a tus listados de productos o cuentas de anuncios en vivo.
  • Prueba con un lote pequeño. Filtra hasta una sola categoría, para que puedas inspeccionar la salida rápidamente en lugar de esperar una ejecución completa del catálogo.
  • Regenera el feed manualmente desde la página Gestionar feeds después de añadir o cambiar un filtro, luego abre el archivo de feed sin procesar para confirmar que tu cambio aparece como se esperaba.
  • Comprueba conflictos de filtros. Si más de un plugin o fragmento se engancha al mismo filtro, se ejecutan en orden de registro (o por prioridad, si has establecido una). Registra los valores entrantes y salientes en tu callback mientras pruebas para confirmar que nada anterior está sobrescribiendo tu cambio.
  • Vuelve a probar después de una actualización del plugin. Los nombres de los hooks son parte de la API pública del plugin, y AdTribes evita renombrarlos sin previo aviso, pero sigue siendo una buena práctica confirmar que tus personalizaciones siguen funcionando después de actualizar.

Preguntas frecuentes

¿Dónde añado este código?
Añádelo a un plugin personalizado (específico del sitio), o al functions.php de tu tema activo si no estás usando un tema hijo. No edites los archivos de Product Feed Pro directamente, ya que cualquier cambio allí se pierde en la próxima actualización del plugin.
¿Sobrevivirá mi filtro a una actualización del plugin?
Sí, siempre que lo añadas a través de un plugin personalizado o tu tema, y siempre que el nombre del hook permanezca igual. AdTribes trata los nombres de los hooks como parte de la API pública del plugin. Aun así, prueba en staging después de cualquier actualización.
¿Puedo añadir un atributo completamente nuevo al feed de esta manera?
No directamente con estos filtros de escritura. Para añadir un nuevo atributo disponible para el mapeo de campos, usa adt_product_feed_attributes o adt_product_feed_custom_attributes, cubiertos en Hooks y filtros disponibles en Product Feed Pro. Una vez que un atributo está mapeado, los filtros de escritura de este artículo te permiten cambiar cómo se escribe su valor en el archivo.
¿Funciona esto para feeds JSONL?
No. Los feeds JSONL y JSONL.GZ utilizan un escritor separado con su propio filtro, adt_product_feed_jsonl_product. Eso está fuera del alcance de este artículo, pero está listado en la referencia de hooks anterior.

¿Necesitas más ayuda?

Si estás en Product Feed Elite o en otro plugin premium de AdTribes y necesitas ayuda con una personalización específica, abre un ticket de soporte y el equipo podrá indicarte el hook adecuado para tu caso de uso.

Si estás usando el plugin gratuito Product Feed Pro, haz tu pregunta en el foro de soporte de WordPress.org.

¿Te ha resultado útil este artículo?

Artículos relacionados

Completa tu compra
Feed de productos de WooCommerce de AdTribes

El mejor plugin de feeds de productos de WooCommerce

  • AdTribes Pty Ltd
    ABN: 40 675 636 816
Producto
Recursos e información
Sitios asociados
Rymera