221 lines
7.5 KiB
PHP
Executable file
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');
|