Как сортировать продукты по индивидуальному поле в блоке сбора продуктов WooCommercePhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как сортировать продукты по индивидуальному поле в блоке сбора продуктов WooCommerce

Сообщение Anonymous »

Я запрограммировал эти функции в Vibe для сортировки дополнительных продаж, перекрестных продаж и сопутствующих товаров в WooCommerce по настраиваемому полю _ggcom_stage_date.

Код: Выделить всё

/**
* Tri unifié des produits liés, upsells et cross-sells
* Compatible thèmes classiques et WooCommerce Blocks (thème 2025)
*/

// ----- Fonction commune de tri d'un tableau WC_Product ou d'IDs -----
function ggcom_sort_products_by_stage_date( $products_or_ids ) {
$meta_key = '_ggcom_stage_date';
$map = [];

if ( empty( $products_or_ids ) ) {
return $products_or_ids;
}

// Si tableau d'objets WC_Product
if ( is_object( $products_or_ids[0] ) && method_exists( $products_or_ids[0], 'get_id' ) ) {
foreach ( $products_or_ids as $product ) {
$value = get_post_meta( $product->get_id(), $meta_key, true );
$map[ $product->get_id() ] = (int) ( $value ?: 0 );
}
arsort( $map, SORT_NUMERIC );

$sorted = [];
foreach ( array_keys( $map ) as $id ) {
foreach ( $products_or_ids as $product ) {
if ( $product->get_id() === $id ) {
$sorted[] = $product;
break;
}
}
}

// Debug optionnel
// error_log( '[ggcom] Produits triés (objets) : ' . implode( ', ', array_map( function($p) use($meta_key){ return $p->get_id().'('.get_post_meta($p->get_id(), $meta_key,true).')'; }, $sorted ) ) );

return $sorted;
}

// Si tableau d'IDs
if ( is_numeric( $products_or_ids[0] ) ) {
foreach ( $products_or_ids as $id ) {
$value = get_post_meta( $id, $meta_key, true );
$map[ $id ] = (int) ( $value ?: 0 );
}
arsort( $map, SORT_NUMERIC );

// Debug optionnel
// error_log( '[ggcom] Produits triés (IDs) : ' . implode( ', ', array_keys($map) ) );

return array_keys( $map );
}

return $products_or_ids;
}

// ----- Thèmes classiques : PHP hooks -----
// Related products
add_filter( 'woocommerce_product_related_posts', 'ggcom_sort_related_by_stage_date', 999, 1 );
function ggcom_sort_related_by_stage_date( $related_ids ) {
return ggcom_sort_products_by_stage_date( $related_ids );
}

// Upsells
add_filter( 'woocommerce_upsells', 'ggcom_sort_upsells_by_stage_date', 999, 1 );
function ggcom_sort_upsells_by_stage_date( $upsell_products ) {
return ggcom_sort_products_by_stage_date( $upsell_products );
}

// Cross-sells
add_filter( 'woocommerce_cross_sells', 'ggcom_sort_cross_sells_by_stage_date', 999, 1 );
function ggcom_sort_cross_sells_by_stage_date( $cross_sell_products ) {
return ggcom_sort_products_by_stage_date( $cross_sell_products );
}

// ----- Thème 2025 / WooCommerce Blocks : tri REST API -----
add_filter( 'woocommerce_rest_product_query', function( $args, $request ) {
// Vérifie que ce sont des produits inclus dans le bloc product-collection
if ( isset( $request['include'] ) && ! empty( $request['include'] ) ) {
$args['meta_key'] = '_ggcom_stage_date';
$args['orderby']  = 'meta_value_num';
$args['order']    = 'DESC';
// Debug optionnel
// error_log( '[ggcom] REST API block tri appliqué sur IDs : ' . implode( ', ', $request['include'] ) );
}
return $args;
}, 10, 2 );
Он работает, как и ожидалось, в классической теме WordPress, такой как, например, Understrap, дополнительные продажи сортируются по дате на странице продукта.
Однако мне не удается заставить его работать в теме двадцать пять с блоком коллекции продуктов.
Я протестировал различные фильтры, такие как woocommerce_rest_product_query, но ни один из них не дает ожидаемого результата, и продукты продолжают сортироваться по параметру, выбранному в блоке конструктора сайтов wp.
Есть ли способ переопределить эту функцию?

Подробнее здесь: https://stackoverflow.com/questions/797 ... tion-block
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»