haiku-atelier-2024/web/app/themes/haiku-atelier-2024/src/inc/FonctionnalitesWooCommerce.php

221 lines
7.5 KiB
PHP
Executable file

<?php
/**
* Personnalise les fonctionnalités du thème autour de WooCommerce.
*/
declare(strict_types=1);
use HaikuAtelier\WP\Resource;
use function Crell\fp\pipe;
// Images du Produit
/**
* Désactive les fonctionnalités liées aux images Produit WooCommerce, empêchant le chargement de
* scripts et styles inutiles.
*/
function desactive_images_produit_woocommerce(): void {
remove_action('woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10);
remove_action('woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20);
remove_action('woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20);
}
/**
* Désactive les champs liés aux images Produit de l'administration.
*/
function desactive_champs_admin_images_produit_woocommerce(): void {
// Désactive le champ « Galerie d'images du Produit »
remove_meta_box('woocommerce-product-images', 'product', 'side');
}
// Scripts et styles
/**
* Désactive tous les scripts et styles WooCommerce.
*/
function dequeue_woocommerce_styles_scripts(): void {
// Styles
wp_dequeue_style('photoswipe-default-skin-css');
wp_dequeue_style('photoswipe-default-skin');
wp_dequeue_style('photoswipe');
wp_dequeue_style('wc-blocks-style');
wp_dequeue_style('woocommerce_chosen_styles');
wp_dequeue_style('woocommerce_fancybox_styles');
wp_dequeue_style('woocommerce_frontend_styles');
wp_dequeue_style('woocommerce_prettyPhoto_css');
wp_dequeue_style('woocommerce-blocks');
wp_dequeue_style('woocommerce-general');
wp_dequeue_style('woocommerce-inline');
wp_dequeue_style('woocommerce-layout');
wp_dequeue_style('woocommerce-smallscreen');
wp_dequeue_style('wp-block-library');
// Scripts
wp_dequeue_script('fancybox');
wp_dequeue_script('flexslider');
wp_dequeue_script('jquery-blockui');
wp_dequeue_script('jquery-placeholder');
wp_dequeue_script('photoswipe-ui-default');
wp_dequeue_script('prettyPhoto-init');
wp_dequeue_script('prettyPhoto');
wp_dequeue_script('sourcebuster-js');
wp_dequeue_script('wc_price_slider');
wp_dequeue_script('wc-add-to-cart-variation');
wp_dequeue_script('wc-add-to-cart');
wp_dequeue_script('wc-blocks');
wp_dequeue_script('wc-cart-fragments');
wp_dequeue_script('wc-cart');
wp_dequeue_script('wc-checkout');
wp_dequeue_script('wc-chosen');
wp_dequeue_script('wc-order-attribution');
wp_dequeue_script('wc-single-product');
wp_dequeue_script('woocommerce');
wp_dequeue_script('zoom');
wp_deregister_script('flexslider');
wp_deregister_script('sourcebuster-js');
wp_deregister_script('wc-order-attribution');
wp_deregister_script('zoom');
}
/**
* Désactive scripts et styles liés aux blocs Gutenberg.
*/
function desactive_blocs_gutenberg_woocommerce(): void {
wp_deregister_style('wc-blocks-style');
wp_dequeue_style('wc-blocks-style');
}
/**
* Désactive Photoswipe.
*
* Cette fonction surcharge son homonyme et désactive les fonctionnalités non désirées.
*/
function woocommerce_photoswipe(): void {
remove_theme_support('wc-product-gallery-zoom');
remove_theme_support('wc-product-gallery-lightbox');
remove_theme_support('wc-product-gallery-slider');
}
/**
* Désactive l'Attribution des Commandes WooCommerce.
*/
function desactive_attribution_commande_woocommerce(): void {
update_option('woocommerce_feature_order_attribution_enabled', '');
}
/**
* Retire d'autres merdes WooCommerce.
*/
function retire_script_galerie(): void {
remove_action('wp_head', 'wc_gallery_noscript');
}
function retire_merdes_wc(): void {
// remove WC generator tag
remove_filter('get_the_generator_html', 'wc_generator_tag', 10, 2);
remove_filter('get_the_generator_xhtml', 'wc_generator_tag', 10, 2);
// unload WC scripts
remove_action('wp_enqueue_scripts', [WC_Frontend_Scripts::class, 'load_scripts']);
remove_action('wp_print_scripts', [WC_Frontend_Scripts::class, 'localize_printed_scripts'], 5);
remove_action('wp_print_footer_scripts', [WC_Frontend_Scripts::class, 'localize_printed_scripts'], 5);
// remove "Show the gallery if JS is disabled"
remove_action('wp_head', 'wc_gallery_noscript');
}
/**
* Modifie la réponse REST pour un Produit en y ajoutant des balises <img> pour chaque image d'intérêt.
*
* @param WP_REST_Response $response the response object
*/
function genere_balises_img_dans_produit_dans_reponse_rest(
WP_REST_Response $response,
WC_Data $_product,
WP_REST_Request $_request,
): WP_REST_Response {
// Vérifie que la Réponse a des données
if (empty($response->data)) {
return $response;
}
// Génère la balise <img> pour l'image au repos
$response->data['image_repos'] = pipe(
$response->data['meta_data'],
static fn($metadata): array => array_filter(
array : $metadata,
callback: static fn($entree): bool => '_photos_colonne_gauche|||0|value' === $entree->key,
),
static fn($metadata): array => array_map(array: $metadata, callback: static fn($entree): string => Resource::output_multi_formats_img_tag(
id : $entree?->value,
lazy: true,
)),
static fn($image) => array_values(array: $image)[0],
);
// Génère la balise <img> pour l'image au survol
$response->data['image_survol'] = pipe(
$response->data['meta_data'],
static fn($metadata): array => array_filter(
array : $metadata,
callback: static fn($entree): bool => '_photos_colonne_droite|||0|value' === $entree->key,
),
static fn($metadata): array => array_map(array: $metadata, callback: static fn($entree): string => Resource::output_multi_formats_img_tag(
id : $entree?->value,
lazy: true,
)),
static fn($image) => array_values(array: $image)[0],
);
return $response;
}
/**
* TODO.
*/
function genere_prix_maximal_produit_variable_dans_reponse_rest(
WP_REST_Response $response,
WC_Data $_product,
WP_REST_Request $_request,
): WP_REST_Response {
// Vérifie que la Réponse a des données
if (empty($response->data)) {
return $response;
}
// Si le Produit n'est pas Variable, assigner le prix du Produit comme prix maximal
if ('variable' !== $response->data['type']) {
$response->data['prix_maximal'] = $response->data['regular_price'];
return $response;
}
// Assigne le prix de la Variation la plus chère dans la Réponse
$response->data['prix_maximal'] = collect($response->data['variations'])
->map(wc_get_product(...))
->map(static fn($p) => $p->get_price())->max();
return $response;
}
/**
* Retire la propagande commerciale de WooCommerce du menu.
*/
function remove_payments_ad_tab(): void {
remove_menu_page('admin.php?page=wc-settings&tab=checkout');
}
add_action('add_meta_boxes', 'desactive_champs_admin_images_produit_woocommerce', 40);
add_action('admin_menu', 'remove_payments_ad_tab', 999);
add_action('after_setup_theme', 'desactive_images_produit_woocommerce');
add_action('enqueue_block_assets', 'desactive_blocs_gutenberg_woocommerce');
add_action('init', 'desactive_attribution_commande_woocommerce');
add_action('init', 'retire_script_galerie');
add_action('template_redirect', 'retire_merdes_wc');
add_action('wp_enqueue_scripts', 'dequeue_woocommerce_styles_scripts');
add_filter('woocommerce_enqueue_styles', '__return_empty_array');
add_filter('woocommerce_rest_prepare_product_object', 'genere_balises_img_dans_produit_dans_reponse_rest', 10, 3);
add_filter('woocommerce_rest_prepare_product_object', 'genere_prix_maximal_produit_variable_dans_reponse_rest', 10, 3);
// DEBUG
// add_filter('woocommerce_store_api_disable_nonce_check', '__return_true');