Files
2026-04-28 15:13:50 +02:00

138 lines
5.3 KiB
PHP

<?php
/**
* WP Product Feed Processor Functions Trait.
*
* @package WP Product Feed Manager/Functions
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
trait WPPFM_Feed_Processor_Functions {
/**
* Adds a file format string to the feed.
* Always flushes buffer before writing format lines (headers/footers) to ensure correct order.
*
* @param array $line_data containing the file format line.
*
* @return boolean true if the format line has been added, false if it failed.
* @since 3.15.0 - Updated to flush buffer before writing format lines.
*/
private function add_file_format_line_to_feed( $line_data ) {
// Always flush buffer before writing format lines (headers/footers)
// This ensures headers are written first and footers are written last
if ( method_exists( $this, 'flush_file_buffer' ) ) {
$this->flush_file_buffer();
}
return false !== wppfm_append_line_to_file( $this->_feed_file_path, $line_data['file_format_line'] );
}
/**
* Adds an error message to the feed.
*
* @param array $error_message_data containing the error message in a 'feed_line_message' element.
*
* @return boolean true if the error message has been added, false if it failed.
*/
private function add_error_message_to_feed( $error_message_data ) {
return false !== wppfm_append_line_to_file( $this->_feed_file_path, $error_message_data['feed_line_message'] );
}
/**
* Register a feed update in the database.
*
* @param string $feed_id the feed id.
* @param string $feed_name the name of the feed.
* @param string $nr_products the number of products in the feed.
* @param string $status the status of the feed, default null.
*/
private function register_feed_update( $feed_id, $feed_name, $nr_products, $status = null ) {
$data_class = new WPPFM_Data();
// Register the update and update the feed Last Change time.
$data_class->update_feed_data( $feed_id, wppfm_get_file_url( $feed_name ), $nr_products );
$actual_status = $status ?: $data_class->get_feed_status( $feed_id );
if ( '4' !== $actual_status && '5' !== $actual_status && '6' !== $actual_status ) { // No errors.
$data_class->update_feed_status( $feed_id, intval( $status ) ); // Put feed on status hold if no errors are reported.
}
}
/**
* Gets the main data of a specific product.
*
* @param string $product_id the product id.
* @param string $parent_product_id the products parent id.
* @param string $post_columns_query_string a query string with the post-columns.
* @param WC_Product|null $wc_product Optional. Already loaded WooCommerce product object to avoid redundant loading.
*
* @return object|bool with the product main data.
*/
private function get_products_main_data( $product_id, $parent_product_id, $post_columns_query_string, $wc_product = null ) {
$queries_class = new WPPFM_Queries();
$prep_meta_class = new WPPFM_Feed_Value_Editors();
$product_data = $queries_class->read_post_data( $product_id, $post_columns_query_string );
if ( 'object' !== gettype( $product_data ) ) {
return false;
}
// WPML support.
if ( has_filter( 'wpml_translation' ) ) {
$product_data = apply_filters( 'wpml_translation', $product_data, $this->_feed_data->language );
}
// Polylang support.
if ( has_filter( 'pll_translation' ) ) {
$product_data = apply_filters( 'pll_translation', $product_data, $this->_feed_data->language );
}
// Translatepress support.
if ( has_filter( 'wppfm_transpress_translation' ) ) {
$product_data = apply_filters( 'wppfm_transpress_translation', $product_data, $this->_feed_data->language );
}
// Parent ids are required to get the main data from product variations.
$product_parent_ids = 0 !== $parent_product_id ? array( $parent_product_id ) : $this->get_product_parent_ids( $product_id );
array_unshift( $product_parent_ids, $product_id ); // Add the product id to the parent ids.
$meta_data = $queries_class->read_meta_data( $product_id, $parent_product_id, $product_parent_ids, $this->_pre_data['database_fields']['meta_fields'] );
foreach ( $meta_data as $meta ) {
$meta_value = $prep_meta_class->prep_meta_values( $meta, $this->_feed_data->language, $this->_feed_data->currency );
if ( property_exists( (object) $product_data, $meta->meta_key ) ) {
$meta_key = $meta->meta_key;
if ( '' === $product_data->$meta_key ) {
$product_data = (object) array_merge( (array) $product_data, array( $meta->meta_key => $meta_value ) );
}
} else {
$product_data = (object) array_merge( (array) $product_data, array( $meta->meta_key => $meta_value ) );
}
}
foreach ( $this->_pre_data['database_fields']['active_custom_fields'] as $field ) {
$product_data->{$field} = $this->get_custom_field_data( $product_data->ID, $parent_product_id, $field );
}
foreach ( $this->_pre_data['database_fields']['third_party_custom_fields'] as $third_party_field ) {
$product_data->{$third_party_field} = $this->get_third_party_custom_field_data( $product_data->ID, $parent_product_id, $third_party_field );
}
if ( $this->_feed_data ) { // @since 2.29.0 - To not start this function when using the WooCommerce Google Review Feed Manager plugin version 0.15.0 or lower.
$this->handle_procedural_attributes( $product_data, $wc_product );
}
return $product_data;
}
}