corvée(formatage) màj de la configuration Mago
This commit is contained in:
parent
730184704e
commit
8e0ec560fd
34 changed files with 1108 additions and 847 deletions
|
|
@ -18,156 +18,162 @@ $finder = new Finder()->in(__DIR__)->exclude([
|
|||
return new Config()
|
||||
->setRiskyAllowed(true)
|
||||
->setRules([
|
||||
'array_syntax' => ['syntax' => 'short'],
|
||||
'assign_null_coalescing_to_coalesce_equal' => true,
|
||||
'attribute_empty_parentheses' => ['use_parentheses' => true],
|
||||
'blank_line_after_namespace' => true,
|
||||
'blank_lines_before_namespace' => ['min_line_breaks' => 1, 'max_line_breaks' => 2],
|
||||
'cast_spaces' => true,
|
||||
'class_attributes_separation' => [
|
||||
'elements' => [
|
||||
'case' => 'none',
|
||||
'const' => 'none',
|
||||
'method' => 'one',
|
||||
'property' => 'one',
|
||||
'trait_import' => 'none',
|
||||
],
|
||||
'array_syntax' => ['syntax' => 'short'],
|
||||
'assign_null_coalescing_to_coalesce_equal' => true,
|
||||
'attribute_empty_parentheses' => ['use_parentheses' => true],
|
||||
'blank_line_after_namespace' => true,
|
||||
'blank_lines_before_namespace' => ['min_line_breaks' => 1, 'max_line_breaks' => 2],
|
||||
'cast_spaces' => true,
|
||||
'class_attributes_separation' => ['elements' => [
|
||||
'case' => 'none',
|
||||
'const' => 'none',
|
||||
'method' => 'one',
|
||||
'property' => 'one',
|
||||
'trait_import' => 'none',
|
||||
]],
|
||||
'class_reference_name_casing' => true,
|
||||
'clean_namespace' => true,
|
||||
'combine_consecutive_issets' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'combine_nested_dirname' => true,
|
||||
'comment_to_phpdoc' => true,
|
||||
'constant_case' => true,
|
||||
'date_time_immutable' => true,
|
||||
'declare_equal_normalize' => true,
|
||||
'declare_parentheses' => true,
|
||||
'declare_strict_types' => true,
|
||||
'dir_constant' => true,
|
||||
'echo_tag_syntax' => true,
|
||||
'encoding' => true,
|
||||
'ereg_to_preg' => true,
|
||||
'error_suppression' => true,
|
||||
'explicit_indirect_variable' => true,
|
||||
'explicit_string_variable' => true,
|
||||
'final_class' => true,
|
||||
'final_internal_class' => true,
|
||||
'full_opening_tag' => true,
|
||||
'fully_qualified_strict_types' => ['import_symbols' => true],
|
||||
'function_to_constant' => true,
|
||||
'global_namespace_import' => [
|
||||
'import_classes' => true,
|
||||
'import_constants' => true,
|
||||
'import_functions' => true,
|
||||
],
|
||||
'class_reference_name_casing' => true,
|
||||
'clean_namespace' => true,
|
||||
'combine_consecutive_issets' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'combine_nested_dirname' => true,
|
||||
'comment_to_phpdoc' => true,
|
||||
'constant_case' => true,
|
||||
'date_time_immutable' => true,
|
||||
'declare_equal_normalize' => true,
|
||||
'declare_parentheses' => true,
|
||||
'declare_strict_types' => true,
|
||||
'dir_constant' => true,
|
||||
'echo_tag_syntax' => true,
|
||||
'encoding' => true,
|
||||
'ereg_to_preg' => true,
|
||||
'error_suppression' => true,
|
||||
'explicit_indirect_variable' => true,
|
||||
'explicit_string_variable' => true,
|
||||
'final_class' => true,
|
||||
'final_internal_class' => true,
|
||||
'full_opening_tag' => true,
|
||||
'fully_qualified_strict_types' => ['import_symbols' => true],
|
||||
'function_to_constant' => true,
|
||||
'global_namespace_import' => ['import_classes' => true, 'import_constants' => true, 'import_functions' => true],
|
||||
'heredoc_to_nowdoc' => true,
|
||||
'integer_literal_case' => true,
|
||||
'lambda_not_used_import' => true,
|
||||
'list_syntax' => true,
|
||||
'logical_operators' => true,
|
||||
'long_to_shorthand_operator' => true,
|
||||
'lowercase_cast' => true,
|
||||
'lowercase_keywords' => true,
|
||||
'lowercase_static_reference' => true,
|
||||
'magic_constant_casing' => true,
|
||||
'magic_method_casing' => true,
|
||||
'mb_str_functions' => true,
|
||||
'modernize_strpos' => ['modernize_stripos' => true],
|
||||
'modernize_types_casting' => true,
|
||||
'modifier_keywords' => true,
|
||||
'multiline_comment_opening_closing' => true,
|
||||
'native_constant_invocation' => true,
|
||||
'native_function_casing' => true,
|
||||
'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'namespaced', 'strict' => true],
|
||||
'native_type_declaration_casing' => true,
|
||||
'new_expression_parentheses' => true,
|
||||
'no_alias_functions' => ['sets' => ['@all']],
|
||||
'no_alias_language_construct_call' => true,
|
||||
'no_alternative_syntax' => true,
|
||||
'no_binary_string' => true,
|
||||
'no_closing_tag' => true,
|
||||
'no_empty_comment' => true,
|
||||
'no_homoglyph_names' => true,
|
||||
'no_leading_import_slash' => true,
|
||||
'no_mixed_echo_print' => ['use' => 'echo'],
|
||||
'no_multiline_whitespace_around_double_arrow' => true,
|
||||
'no_multiple_statements_per_line' => true,
|
||||
'no_null_property_initialization' => true,
|
||||
'no_php4_constructor' => true,
|
||||
'no_short_bool_cast' => true,
|
||||
'no_trailing_comma_in_singleline' => true,
|
||||
'no_trailing_whitespace_in_comment' => true,
|
||||
'no_unneeded_braces' => ['namespaces' => true],
|
||||
'no_unneeded_control_parentheses' => [
|
||||
'statements' => [
|
||||
'break',
|
||||
'clone',
|
||||
'continue',
|
||||
'echo_print',
|
||||
'negative_instanceof',
|
||||
'others',
|
||||
'return',
|
||||
'switch_case',
|
||||
'yield',
|
||||
'yield_from',
|
||||
],
|
||||
'heredoc_to_nowdoc' => true,
|
||||
'integer_literal_case' => true,
|
||||
'lambda_not_used_import' => true,
|
||||
'list_syntax' => true,
|
||||
'logical_operators' => true,
|
||||
'long_to_shorthand_operator' => true,
|
||||
'lowercase_cast' => true,
|
||||
'lowercase_keywords' => true,
|
||||
'lowercase_static_reference' => true,
|
||||
'magic_constant_casing' => true,
|
||||
'magic_method_casing' => true,
|
||||
'mb_str_functions' => true,
|
||||
'modernize_strpos' => ['modernize_stripos' => true],
|
||||
'modernize_types_casting' => true,
|
||||
'modifier_keywords' => true,
|
||||
'multiline_comment_opening_closing' => true,
|
||||
'native_constant_invocation' => true,
|
||||
'native_function_casing' => true,
|
||||
'native_function_invocation' => [
|
||||
'include' => ['@compiler_optimized'],
|
||||
'scope' => 'namespaced',
|
||||
'strict' => true,
|
||||
],
|
||||
'no_unneeded_final_method' => true,
|
||||
'no_unneeded_import_alias' => true,
|
||||
'no_unreachable_default_argument_value' => true,
|
||||
'no_unset_cast' => true,
|
||||
'no_unset_on_property' => true,
|
||||
'no_unused_imports' => true,
|
||||
'no_useless_concat_operator' => true,
|
||||
'no_useless_nullsafe_operator' => true,
|
||||
'no_useless_printf' => true,
|
||||
'no_useless_return' => true,
|
||||
'no_useless_sprintf' => true,
|
||||
'no_whitespace_before_comma_in_array' => ['after_heredoc' => true],
|
||||
'non_printable_character' => true,
|
||||
'normalize_index_brace' => true,
|
||||
'nullable_type_declaration' => ['syntax' => 'union'],
|
||||
'native_type_declaration_casing' => true,
|
||||
'new_expression_parentheses' => true,
|
||||
'no_alias_functions' => ['sets' => ['@all']],
|
||||
'no_alias_language_construct_call' => true,
|
||||
'no_alternative_syntax' => true,
|
||||
'no_binary_string' => true,
|
||||
'no_closing_tag' => true,
|
||||
'no_empty_comment' => true,
|
||||
'no_homoglyph_names' => true,
|
||||
'no_leading_import_slash' => true,
|
||||
'no_mixed_echo_print' => ['use' => 'echo'],
|
||||
'no_multiline_whitespace_around_double_arrow' => true,
|
||||
'no_multiple_statements_per_line' => true,
|
||||
'no_null_property_initialization' => true,
|
||||
'no_php4_constructor' => true,
|
||||
'no_short_bool_cast' => true,
|
||||
'no_trailing_comma_in_singleline' => true,
|
||||
'no_trailing_whitespace_in_comment' => true,
|
||||
'no_unneeded_braces' => ['namespaces' => true],
|
||||
'no_unneeded_control_parentheses' => ['statements' => [
|
||||
'break',
|
||||
'clone',
|
||||
'continue',
|
||||
'echo_print',
|
||||
'negative_instanceof',
|
||||
'others',
|
||||
'return',
|
||||
'switch_case',
|
||||
'yield',
|
||||
'yield_from',
|
||||
]],
|
||||
'no_unneeded_final_method' => true,
|
||||
'no_unneeded_import_alias' => true,
|
||||
'no_unreachable_default_argument_value' => true,
|
||||
'no_unset_cast' => true,
|
||||
'no_unset_on_property' => true,
|
||||
'no_unused_imports' => true,
|
||||
'no_useless_concat_operator' => true,
|
||||
'no_useless_nullsafe_operator' => true,
|
||||
'no_useless_printf' => true,
|
||||
'no_useless_return' => true,
|
||||
'no_useless_sprintf' => true,
|
||||
'no_whitespace_before_comma_in_array' => ['after_heredoc' => true],
|
||||
'non_printable_character' => true,
|
||||
'normalize_index_brace' => true,
|
||||
'nullable_type_declaration' => ['syntax' => 'union'],
|
||||
'nullable_type_declaration_for_default_null_value' => true,
|
||||
'numeric_literal_separator' => ['override_existing' => true, 'strategy' => 'use_separator'],
|
||||
'ordered_attributes' => true,
|
||||
'ordered_class_elements' => ['case_sensitive' => false, 'sort_algorithm' => 'alpha'],
|
||||
'ordered_imports' => ['case_sensitive' => true],
|
||||
'ordered_interfaces' => true,
|
||||
'ordered_traits' => true,
|
||||
'ordered_types' => ['null_adjustment' => 'always_last'],
|
||||
'phpdoc_readonly_class_comment_to_keyword' => true,
|
||||
'phpdoc_to_param_type' => true,
|
||||
'phpdoc_to_property_type' => true,
|
||||
'phpdoc_to_return_type' => true,
|
||||
'pow_to_exponentiation' => true,
|
||||
'protected_to_private' => true,
|
||||
'psr_autoloading' => true,
|
||||
'random_api_migration' => [
|
||||
'replacements' => ['getrandmax' => 'mt_getrandmax', 'rand' => 'mt_rand', 'srand' => 'mt_srand'],
|
||||
],
|
||||
'return_assignment' => true,
|
||||
'self_accessor' => true,
|
||||
'self_static_accessor' => true,
|
||||
'set_type_to_cast' => true,
|
||||
'short_scalar_cast' => true,
|
||||
'simple_to_complex_string_variable' => true,
|
||||
'simplified_null_return' => true,
|
||||
'single_class_element_per_statement' => true,
|
||||
'single_import_per_statement' => true,
|
||||
'single_line_after_imports' => true,
|
||||
'single_line_comment_spacing' => true,
|
||||
'single_line_comment_style' => true,
|
||||
'single_line_empty_body' => true,
|
||||
'single_trait_insert_per_statement' => true,
|
||||
'standardize_not_equals' => true,
|
||||
'static_lambda' => true,
|
||||
'strict_comparison' => true,
|
||||
'strict_param' => true,
|
||||
'string_implicit_backslashes' => true,
|
||||
'string_length_to_empty' => true,
|
||||
'switch_continue_to_break' => true,
|
||||
'ternary_to_null_coalescing' => true,
|
||||
'trim_array_spaces' => true,
|
||||
'use_arrow_functions' => true,
|
||||
'void_return' => true,
|
||||
'whitespace_after_comma_in_array' => ['ensure_single_space' => true],
|
||||
'numeric_literal_separator' => ['override_existing' => true, 'strategy' => 'use_separator'],
|
||||
'ordered_attributes' => true,
|
||||
'ordered_class_elements' => ['case_sensitive' => false, 'sort_algorithm' => 'alpha'],
|
||||
'ordered_imports' => ['case_sensitive' => true],
|
||||
'ordered_interfaces' => true,
|
||||
'ordered_traits' => true,
|
||||
'ordered_types' => ['null_adjustment' => 'always_last'],
|
||||
'phpdoc_readonly_class_comment_to_keyword' => true,
|
||||
'phpdoc_to_param_type' => true,
|
||||
'phpdoc_to_property_type' => true,
|
||||
'phpdoc_to_return_type' => true,
|
||||
'pow_to_exponentiation' => true,
|
||||
'protected_to_private' => true,
|
||||
'psr_autoloading' => true,
|
||||
'random_api_migration' => ['replacements' => [
|
||||
'getrandmax' => 'mt_getrandmax',
|
||||
'rand' => 'mt_rand',
|
||||
'srand' => 'mt_srand',
|
||||
]],
|
||||
'return_assignment' => true,
|
||||
'self_accessor' => true,
|
||||
'self_static_accessor' => true,
|
||||
'set_type_to_cast' => true,
|
||||
'short_scalar_cast' => true,
|
||||
'simple_to_complex_string_variable' => true,
|
||||
'simplified_null_return' => true,
|
||||
'single_class_element_per_statement' => true,
|
||||
'single_import_per_statement' => true,
|
||||
'single_line_after_imports' => true,
|
||||
'single_line_comment_spacing' => true,
|
||||
'single_line_comment_style' => true,
|
||||
'single_line_empty_body' => true,
|
||||
'single_trait_insert_per_statement' => true,
|
||||
'standardize_not_equals' => true,
|
||||
'static_lambda' => true,
|
||||
'strict_comparison' => true,
|
||||
'strict_param' => true,
|
||||
'string_implicit_backslashes' => true,
|
||||
'string_length_to_empty' => true,
|
||||
'switch_continue_to_break' => true,
|
||||
'ternary_to_null_coalescing' => true,
|
||||
'trim_array_spaces' => true,
|
||||
'use_arrow_functions' => true,
|
||||
'void_return' => true,
|
||||
'whitespace_after_comma_in_array' => ['ensure_single_space' => true],
|
||||
// ---
|
||||
// Each line of multi-line DocComments must have an asterisk [PSR-5] and must be aligned with the first one.
|
||||
'align_multiline_comment' => ['comment_type' => 'all_multiline'],
|
||||
|
|
@ -178,7 +184,7 @@ return new Config()
|
|||
// Removes @param, @return and @var tags that don't provide any useful information.
|
||||
'no_superfluous_phpdoc_tags' => [
|
||||
'allow_hidden_params' => false,
|
||||
'allow_mixed' => false,
|
||||
'allow_mixed' => false,
|
||||
'allow_unused_params' => false,
|
||||
],
|
||||
// PHPDoc should contain @param for all params.
|
||||
|
|
@ -216,22 +222,20 @@ return new Config()
|
|||
// The type of @return annotations of methods returning a reference to itself must the configured one.
|
||||
'phpdoc_return_self_reference' => true,
|
||||
// Scalar types should always be written in the same form. int not integer, bool not boolean, float not real or double.
|
||||
'phpdoc_scalar' => [
|
||||
'types' => [
|
||||
'boolean',
|
||||
'callback',
|
||||
'double',
|
||||
'integer',
|
||||
'never-return',
|
||||
'never-returns',
|
||||
'no-return',
|
||||
'real',
|
||||
'str',
|
||||
],
|
||||
],
|
||||
'phpdoc_scalar' => ['types' => [
|
||||
'boolean',
|
||||
'callback',
|
||||
'double',
|
||||
'integer',
|
||||
'never-return',
|
||||
'never-returns',
|
||||
'no-return',
|
||||
'real',
|
||||
'str',
|
||||
]],
|
||||
// Annotations in PHPDoc should be grouped together so that annotations of the same type immediately follow each other. Annotations of a different type are separated by a single blank line.
|
||||
'phpdoc_separation' => [
|
||||
'groups' => [
|
||||
'groups' => [
|
||||
['Annotation', 'NamedArgumentConstructor', 'Target'],
|
||||
['author', 'copyright', 'license'],
|
||||
['category', 'package', 'subpackage'],
|
||||
|
|
|
|||
|
|
@ -3,8 +3,7 @@
|
|||
"authors": [],
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"HaikuAtelier\\": "web/app/themes/haiku-atelier-2024/src/inc/",
|
||||
"WooCommerce\\": "web/app/plugins/woocommerce"
|
||||
"HaikuAtelier\\": "web/app/themes/haiku-atelier-2024/src/inc/"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
|
|
|
|||
1755
mago-schema.json
1755
mago-schema.json
File diff suppressed because it is too large
Load diff
|
|
@ -36,6 +36,7 @@ threads = 0
|
|||
no-else-clause = { enabled = false }
|
||||
|
||||
[analyzer]
|
||||
allow-implicit-pipe-callable-types = false
|
||||
allow-possibly-undefined-array-keys = false
|
||||
allow-side-effects-in-conditions = true
|
||||
analyze-dead-code = true
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ $wp_postmeta = "{$wpdb->prefix}postmeta";
|
|||
try {
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
// Error Handling
|
||||
$sql = "UPDATE {$wp_postmeta} SET meta_value = REPLACE(meta_value,'-scaled.jpg','.jpg') WHERE meta_key='_wp_attached_file' AND meta_value LIKE '%-scaled.jpg%'";
|
||||
$sql = "UPDATE {$wp_postmeta} SET meta_value = REPLACE(meta_value,'-scaled.jpg','.jpg') WHERE meta_key='_wp_attached_file' AND meta_value LIKE '%-scaled.jpg%'";
|
||||
$result = $pdo->exec($sql);
|
||||
print_r($result);
|
||||
} catch (PDOException $e) {
|
||||
|
|
@ -29,12 +29,12 @@ $image_metas = [];
|
|||
try {
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
// Error Handling
|
||||
$sql = "SELECT * FROM {$wp_postmeta} WHERE meta_value LIKE '%-scaled.jpg%' AND meta_key='_wp_attachment_metadata'";
|
||||
$statement = $pdo->query($sql);
|
||||
$sql = "SELECT * FROM {$wp_postmeta} WHERE meta_value LIKE '%-scaled.jpg%' AND meta_key='_wp_attachment_metadata'";
|
||||
$statement = $pdo->query($sql);
|
||||
$image_metas = $statement->fetchAll();
|
||||
foreach ($image_metas as $meta) {
|
||||
$meta_value = unserialize($meta['meta_value']);
|
||||
$file = $meta_value['file'];
|
||||
$meta_value = unserialize($meta['meta_value']);
|
||||
$file = $meta_value['file'];
|
||||
$meta_value['file'] = str_replace('-scaled.jpg', '.jpg', $file);
|
||||
update_post_meta($meta['post_id'], $meta['meta_key'], $meta_value);
|
||||
$result = get_post_meta($meta['post_id'], $meta['meta_key']);
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ use Timber\Timber;
|
|||
|
||||
use function add_action;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['404.twig'];
|
||||
|
||||
/**
|
||||
|
|
@ -25,7 +25,7 @@ $templates = ['404.twig'];
|
|||
function load_page_resources(): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-a-propos',
|
||||
path: '/assets/css/pages/page-modele-simple.css',
|
||||
path : '/assets/css/pages/page-modele-simple.css',
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,13 +22,13 @@ use function wc_get_products;
|
|||
use function wp_create_nonce;
|
||||
use function wp_json_encode;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['boutique.twig'];
|
||||
|
||||
/** @var list<WC_Product> $wc_products Les informations brutes des Produits. */
|
||||
$wc_products = wc_get_products(['limit' => 12, 'order' => 'DESC', 'orderby' => 'date', 'status' => 'publish']);
|
||||
|
||||
$products = array_map(callback: Product::from_wc_product(...), array: $wc_products);
|
||||
$products = array_map(callback: Product::from_wc_product(...), array: $wc_products);
|
||||
$context['products'] = $products;
|
||||
|
||||
// Injecte les états initiaux des données du Produit sous forme de JSON dans le contexte.
|
||||
|
|
@ -40,14 +40,14 @@ $context['page_states'] = $page_states;
|
|||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-boutique',
|
||||
path: '/assets/css/pages/page-boutique.css',
|
||||
path : '/assets/css/pages/page-boutique.css',
|
||||
);
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-page-boutique',
|
||||
id : 'haiku-atelier-2024-scripts-page-boutique',
|
||||
path: '/assets/js/scripts-page-boutique.js',
|
||||
);
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-menu-categories',
|
||||
id : 'haiku-atelier-2024-scripts-menu-categories',
|
||||
path: '/assets/js/scripts-menu-categories.js',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -13,17 +13,17 @@ use Timber\Timber;
|
|||
|
||||
use function add_action;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['accueil.twig'];
|
||||
|
||||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-page-accueil',
|
||||
id : 'haiku-atelier-2024-scripts-page-accueil',
|
||||
path: '/assets/js/scripts-page-accueil.js',
|
||||
);
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-accueil',
|
||||
path: '/assets/css/pages/page-accueil.css',
|
||||
path : '/assets/css/pages/page-accueil.css',
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -24,21 +24,21 @@ Timber::$dirname = ['views'];
|
|||
// Charge les Scripts du thème (report d'erreurs)
|
||||
function load_scripts(): void {
|
||||
wp_enqueue_script_module(
|
||||
id: 'haiku-atelier-2024-bouton-panier',
|
||||
deps: [],
|
||||
src: get_template_directory_uri() . '/assets/js/scripts-bouton-panier.js',
|
||||
id : 'haiku-atelier-2024-bouton-panier',
|
||||
deps : [],
|
||||
src : get_template_directory_uri() . '/assets/js/scripts-bouton-panier.js',
|
||||
version: filemtime(get_template_directory() . '/assets/js/scripts-bouton-panier.js'),
|
||||
);
|
||||
wp_enqueue_script_module(
|
||||
id: 'haiku-atelier-2024-menu-mobile',
|
||||
deps: [],
|
||||
src: get_template_directory_uri() . '/assets/js/scripts-menu-mobile.js',
|
||||
id : 'haiku-atelier-2024-menu-mobile',
|
||||
deps : [],
|
||||
src : get_template_directory_uri() . '/assets/js/scripts-menu-mobile.js',
|
||||
version: filemtime(get_template_directory() . '/assets/js/scripts-menu-mobile.js'),
|
||||
);
|
||||
wp_enqueue_script_module(
|
||||
id: 'haiku-atelier-2024-bouton-retour-sommet',
|
||||
deps: [],
|
||||
src: get_template_directory_uri() . '/assets/js/scripts-bouton-retour-sommet.js',
|
||||
id : 'haiku-atelier-2024-bouton-retour-sommet',
|
||||
deps : [],
|
||||
src : get_template_directory_uri() . '/assets/js/scripts-bouton-retour-sommet.js',
|
||||
version: filemtime(get_template_directory() . '/assets/js/scripts-bouton-retour-sommet.js'),
|
||||
);
|
||||
}
|
||||
|
|
@ -49,10 +49,10 @@ add_action('wp_enqueue_scripts', 'load_scripts');
|
|||
function charge_styles_haiku_atelier_2024(): void {
|
||||
wp_enqueue_style(
|
||||
handle: 'haiku-atelier-2024-styles',
|
||||
src: get_template_directory_uri() . '/assets/css/main.css',
|
||||
deps: [],
|
||||
ver: filemtime(get_template_directory() . '/assets/css/main.css'),
|
||||
media: 'all',
|
||||
src : get_template_directory_uri() . '/assets/css/main.css',
|
||||
deps : [],
|
||||
ver : filemtime(get_template_directory() . '/assets/css/main.css'),
|
||||
media : 'all',
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -67,70 +67,70 @@ new StarterSite();
|
|||
function enregistre_personnalisations_theme(mixed $wp_customize): void {
|
||||
// Section « Réseaux sociaux »
|
||||
$wp_customize->add_section('liens_reseaux_sociaux', [
|
||||
'title' => __('Liens des réseaux sociaux'),
|
||||
'title' => __('Liens des réseaux sociaux'),
|
||||
'description' => __("Liens des réseaux sociaux s'affichant dans le pied de page."),
|
||||
]);
|
||||
|
||||
// Instagram
|
||||
$wp_customize->add_setting('lien_instagram', ['type' => 'theme_mod', 'capability' => 'edit_theme_options']);
|
||||
$wp_customize->add_control('lien_instagram', [
|
||||
'type' => 'url',
|
||||
'type' => 'url',
|
||||
'section' => 'liens_reseaux_sociaux',
|
||||
'label' => __('Profil Instagram'),
|
||||
'label' => __('Profil Instagram'),
|
||||
]);
|
||||
|
||||
// Facebook
|
||||
$wp_customize->add_setting('lien_facebook', ['type' => 'theme_mod', 'capability' => 'edit_theme_options']);
|
||||
$wp_customize->add_control('lien_facebook', [
|
||||
'type' => 'url',
|
||||
'type' => 'url',
|
||||
'section' => 'liens_reseaux_sociaux',
|
||||
'label' => __('Profil Facebook'),
|
||||
'label' => __('Profil Facebook'),
|
||||
]);
|
||||
|
||||
// Pinterest
|
||||
$wp_customize->add_setting('lien_pinterest', ['type' => 'theme_mod', 'capability' => 'edit_theme_options']);
|
||||
$wp_customize->add_control('lien_pinterest', [
|
||||
'type' => 'url',
|
||||
'type' => 'url',
|
||||
'section' => 'liens_reseaux_sociaux',
|
||||
'label' => __('Profil Pinterest'),
|
||||
'label' => __('Profil Pinterest'),
|
||||
]);
|
||||
|
||||
// Section « Descriptions Produits »
|
||||
$wp_customize->add_section('descriptions_produits', [
|
||||
'title' => __('Textes des descriptions Produits'),
|
||||
'title' => __('Textes des descriptions Produits'),
|
||||
'description' => __('Textes des descriptions apparaissant sur les pages Produit.'),
|
||||
]);
|
||||
|
||||
$wp_customize->add_setting('texte_conditions_livraison', [
|
||||
'capability' => 'edit_theme_options',
|
||||
'default' => '',
|
||||
'capability' => 'edit_theme_options',
|
||||
'default' => '',
|
||||
'sanitize_callback' => 'wp_kses_post',
|
||||
'transport' => 'postMessage',
|
||||
'type' => 'theme_mod',
|
||||
'transport' => 'postMessage',
|
||||
'type' => 'theme_mod',
|
||||
]);
|
||||
$wp_customize->add_control(new Controle_Personnalise_TinyMCE($wp_customize, 'texte_conditions_livraison', [
|
||||
'label' => __('Conditions de livraison'),
|
||||
'label' => __('Conditions de livraison'),
|
||||
'description' => __('Descriptif des conditions de livraison.'),
|
||||
'section' => 'descriptions_produits',
|
||||
'section' => 'descriptions_produits',
|
||||
'input_attrs' => [
|
||||
'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link',
|
||||
'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link',
|
||||
'mediaButtons' => true,
|
||||
],
|
||||
]));
|
||||
|
||||
$wp_customize->add_setting('texte_entretien_produit', [
|
||||
'capability' => 'edit_theme_options',
|
||||
'default' => '',
|
||||
'capability' => 'edit_theme_options',
|
||||
'default' => '',
|
||||
'sanitize_callback' => 'wp_kses_post',
|
||||
'transport' => 'postMessage',
|
||||
'type' => 'theme_mod',
|
||||
'transport' => 'postMessage',
|
||||
'type' => 'theme_mod',
|
||||
]);
|
||||
$wp_customize->add_control(new Controle_Personnalise_TinyMCE($wp_customize, 'texte_entretien_produit', [
|
||||
'label' => __('Entretien du Produit'),
|
||||
'label' => __('Entretien du Produit'),
|
||||
'description' => __("Descriptif des bonnes pratiques pour l'entretien du Produit."),
|
||||
'section' => 'descriptions_produits',
|
||||
'section' => 'descriptions_produits',
|
||||
'input_attrs' => [
|
||||
'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link',
|
||||
'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link',
|
||||
'mediaButtons' => true,
|
||||
],
|
||||
]));
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ declare(strict_types=1);
|
|||
|
||||
use Timber\Timber;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['base.twig'];
|
||||
|
||||
Timber::render(data: $context, filenames: $templates);
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ use function get_template_directory;
|
|||
use function getimagesize;
|
||||
use function is_bool;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['a-propos.twig'];
|
||||
|
||||
/** Les dimensions de l'image du storytelling. */
|
||||
|
|
@ -32,10 +32,10 @@ $context['image_dimensions'] = $image_dimensions;
|
|||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-a-propos',
|
||||
path: '/assets/css/pages/page-a-propos.css',
|
||||
path : '/assets/css/pages/page-a-propos.css',
|
||||
);
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-page-a-propos',
|
||||
id : 'haiku-atelier-2024-scripts-page-a-propos',
|
||||
path: '/assets/js/scripts-page-a-propos.js',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ use function collect;
|
|||
use function Crell\fp\pipe;
|
||||
use function WC;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['panier.twig'];
|
||||
|
||||
// Récupère les informations affichés des Produits du Panier
|
||||
|
|
@ -47,60 +47,60 @@ $shipping_subtotal = Cart::parse_cart_value($cart_totals['shipping_total'] ?? 0)
|
|||
// TODO: Nettoyer ça.
|
||||
foreach (WC()->cart->get_cart() as $cle_panier => $article_panier) {
|
||||
$cart[$cle_panier] = [
|
||||
'attributs' => $article_panier['data']?->get_type() === 'variation'
|
||||
'attributs' => $article_panier['data']?->get_type() === 'variation'
|
||||
? Product::recupere_et_formate_attributs_produit($article_panier['data']?->get_attributes())
|
||||
: [],
|
||||
'cle' => $cle_panier,
|
||||
'id_produit' => $article_panier['product_id'],
|
||||
'cle' => $cle_panier,
|
||||
'id_produit' => $article_panier['product_id'],
|
||||
'id_variation' => $article_panier['variation_id'],
|
||||
'image' => pipe($article_panier['data']?->get_image_id(), static fn($id): string => Resource::output_multi_formats_img_tag(
|
||||
id: (string) $id,
|
||||
'image' => pipe($article_panier['data']?->get_image_id(), static fn($id): string => Resource::output_multi_formats_img_tag(
|
||||
id : (string) $id,
|
||||
lazy: true,
|
||||
)),
|
||||
'prix' => $article_panier['data']?->get_price(),
|
||||
'quantite' => $article_panier['quantity'],
|
||||
'url' => $article_panier['data']?->get_permalink(),
|
||||
'titre' => $article_panier['data']?->get_title(),
|
||||
'prix' => $article_panier['data']?->get_price(),
|
||||
'quantite' => $article_panier['quantity'],
|
||||
'url' => $article_panier['data']?->get_permalink(),
|
||||
'titre' => $article_panier['data']?->get_title(),
|
||||
];
|
||||
}
|
||||
|
||||
// Récupère les Adresses de l'Utilisateur
|
||||
$email = WC()->customer->get_billing_email();
|
||||
$adresse_livraison = WC()->customer->get_shipping();
|
||||
$email = WC()->customer->get_billing_email();
|
||||
$adresse_livraison = WC()->customer->get_shipping();
|
||||
$adresse_facturation = WC()->customer->get_billing();
|
||||
$adresse_renseignee = $adresse_livraison['city'] !== '';
|
||||
$adresse_renseignee = $adresse_livraison['city'] !== '';
|
||||
// TODO: Déplacer ça dans une fonction statique de Cart.
|
||||
$allowed_countries = collect(WC()->countries->get_countries())->only(Cart::get_allowed_countries())->toArray();
|
||||
// TODO: Nettoyer ça.
|
||||
$methodes_livraison = collect(WC()->session->get('shipping_for_package_0')['rates'])
|
||||
->values()
|
||||
->map(static fn(WC_Shipping_Rate $methode): array => [
|
||||
'id' => $methode->get_method_id(),
|
||||
'prix' => Number::format((int) $methode->get_cost(), precision: 2),
|
||||
'id' => $methode->get_method_id(),
|
||||
'prix' => Number::format((int) $methode->get_cost(), precision: 2),
|
||||
'selectionnee' => collect(WC()->session->get('chosen_shipping_methods'))->first() === $methode->get_id(),
|
||||
'titre' => $methode->get_label(),
|
||||
'titre' => $methode->get_label(),
|
||||
]);
|
||||
|
||||
$context['email'] = $email;
|
||||
$context['adresse_livraison'] = $adresse_livraison;
|
||||
$context['adresse_facturation'] = $adresse_facturation;
|
||||
$context['adresse_renseignee'] = $adresse_renseignee;
|
||||
$context['sous_total_panier'] = $cart_subtotal;
|
||||
$context['code_promo'] = $promo_code;
|
||||
$context['email'] = $email;
|
||||
$context['adresse_livraison'] = $adresse_livraison;
|
||||
$context['adresse_facturation'] = $adresse_facturation;
|
||||
$context['adresse_renseignee'] = $adresse_renseignee;
|
||||
$context['sous_total_panier'] = $cart_subtotal;
|
||||
$context['code_promo'] = $promo_code;
|
||||
$context['sous_total_reduction'] = $cart_subtotal_with_discount;
|
||||
$context['total_panier'] = $cart_total;
|
||||
$context['produits_panier'] = $cart;
|
||||
$context['pays_livraison'] = $allowed_countries;
|
||||
$context['total_panier'] = $cart_total;
|
||||
$context['produits_panier'] = $cart;
|
||||
$context['pays_livraison'] = $allowed_countries;
|
||||
$context['sous_total_livraison'] = $shipping_subtotal;
|
||||
$context['methodes_livraison'] = $methodes_livraison;
|
||||
$context['methodes_livraison'] = $methodes_livraison;
|
||||
|
||||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-panier',
|
||||
path: '/assets/css/pages/page-panier.css',
|
||||
path : '/assets/css/pages/page-panier.css',
|
||||
);
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-page-panier',
|
||||
id : 'haiku-atelier-2024-scripts-page-panier',
|
||||
path: '/assets/js/scripts-page-panier.js',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -44,9 +44,9 @@ $session_wc = WC()->session;
|
|||
|
||||
/** @var array<string,string> $urls URLs utilisables pour rediriger l'Utilisateur. */
|
||||
$urls = [
|
||||
'accueil' => get_page_link(get_page_by_path('home')),
|
||||
'accueil' => get_page_link(get_page_by_path('home')),
|
||||
'succes_commande' => get_page_link(get_page_by_path('successful-order')),
|
||||
'echec_commande' => get_page_link(get_page_by_path('failed-order')),
|
||||
'echec_commande' => get_page_link(get_page_by_path('failed-order')),
|
||||
];
|
||||
|
||||
// Redirige à la page d'accueil si le Panier est vide
|
||||
|
|
@ -97,14 +97,14 @@ $articles = collect($panier->get_cart())
|
|||
|
||||
return [
|
||||
'price_data' => [
|
||||
'currency' => 'EUR',
|
||||
'currency' => 'EUR',
|
||||
'product_data' => [
|
||||
'name' => $titre_produit,
|
||||
'name' => $titre_produit,
|
||||
'images' => [wp_get_attachment_image_url($article_panier['data']?->get_image_id())],
|
||||
],
|
||||
'unit_amount' => $article_panier['data']?->get_price() * 100,
|
||||
'unit_amount' => $article_panier['data']?->get_price() * 100,
|
||||
],
|
||||
'quantity' => $article_panier['quantity'],
|
||||
'quantity' => $article_panier['quantity'],
|
||||
];
|
||||
})
|
||||
->values()
|
||||
|
|
@ -126,13 +126,13 @@ Stripe::setApiKey(Config::get('STRIPE_API_SECRET'));
|
|||
|
||||
// Met à jour les Codes promos
|
||||
$coupons_stripe = collect(Coupon::all()->data);
|
||||
$coupons_wc = collect(WC()->cart->get_coupons())
|
||||
$coupons_wc = collect(WC()->cart->get_coupons())
|
||||
->map(static fn(WC_Coupon $coupon): array => [
|
||||
'currency' => 'EUR',
|
||||
'duration' => get_discount_duration($coupon),
|
||||
'currency' => 'EUR',
|
||||
'duration' => get_discount_duration($coupon),
|
||||
'fixed_cart' === $coupon->get_discount_type() ? 'amount_off' : 'percent_off' => get_discount_amount($coupon),
|
||||
'id' => $coupon->get_code(),
|
||||
'name' => $coupon->get_code(),
|
||||
'id' => $coupon->get_code(),
|
||||
'name' => $coupon->get_code(),
|
||||
])
|
||||
->each(static function (array $item) use ($coupons_stripe): void {
|
||||
// Si le code promo n'existe pas, le créer
|
||||
|
|
@ -147,19 +147,19 @@ $reductions_stripe = $coupons_wc
|
|||
|
||||
/** @var Session $session_checkout_stripe */
|
||||
$session_checkout_stripe = Session::create([
|
||||
'cancel_url' => $urls['echec_commande'],
|
||||
'customer_email' => $email_client,
|
||||
'discounts' => $reductions_stripe,
|
||||
'line_items' => $articles,
|
||||
'mode' => 'payment',
|
||||
'success_url' => $urls['succes_commande'] . '?session_id={CHECKOUT_SESSION_ID}',
|
||||
'metadata' => ['order_id' => $order_id, 'order_key' => $order_key],
|
||||
'cancel_url' => $urls['echec_commande'],
|
||||
'customer_email' => $email_client,
|
||||
'discounts' => $reductions_stripe,
|
||||
'line_items' => $articles,
|
||||
'mode' => 'payment',
|
||||
'success_url' => $urls['succes_commande'] . '?session_id={CHECKOUT_SESSION_ID}',
|
||||
'metadata' => ['order_id' => $order_id, 'order_key' => $order_key],
|
||||
'shipping_options' => [[
|
||||
'shipping_rate_data' => [
|
||||
'display_name' => $methode_livraison['nom'],
|
||||
'fixed_amount' => ['amount' => $methode_livraison['cout'], 'currency' => 'EUR'],
|
||||
'tax_behavior' => 'inclusive',
|
||||
'type' => 'fixed_amount',
|
||||
'type' => 'fixed_amount',
|
||||
],
|
||||
]],
|
||||
], ['idempotency_key' => Uuid::v4()]);
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ use Timber\Timber;
|
|||
|
||||
use function add_action;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['contact.twig'];
|
||||
|
||||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-contact',
|
||||
path: '/assets/css/pages/page-contact.min.css',
|
||||
path : '/assets/css/pages/page-contact.min.css',
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ use Timber\Timber;
|
|||
|
||||
use function add_action;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['echec-commande.twig'];
|
||||
|
||||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-modele-simple',
|
||||
path: '/assets/css/pages/page-modele-simple.css',
|
||||
path : '/assets/css/pages/page-modele-simple.css',
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ try {
|
|||
$panier->empty_cart();
|
||||
}
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['succes-commande.twig'];
|
||||
|
||||
// Récupère les données des Produits
|
||||
|
|
@ -76,7 +76,7 @@ try {
|
|||
// Récupère le nom et la valeur de l'attribut du Produit
|
||||
$attribut = $produit->is_type('variable')
|
||||
? collect($produit->get_attributes())->mapWithKeys(static function ($_atr, $cle) use ($produit_commande) {
|
||||
$nom_attribut = wc_attribute_label($cle, $produit_commande->get_product());
|
||||
$nom_attribut = wc_attribute_label($cle, $produit_commande->get_product());
|
||||
$valeur_attribut = $produit_commande->get_product()->get_attribute($cle);
|
||||
|
||||
return [['nom' => $nom_attribut, 'valeur' => $valeur_attribut]];
|
||||
|
|
@ -84,16 +84,16 @@ try {
|
|||
: [];
|
||||
|
||||
return [
|
||||
'attribut' => $attribut,
|
||||
'attribut' => $attribut,
|
||||
'id_produit' => $id_produit,
|
||||
'image' => pipe($produit->get_image_id(), static fn($id): string => Resource::output_multi_formats_img_tag(
|
||||
id: $id,
|
||||
'image' => pipe($produit->get_image_id(), static fn($id): string => Resource::output_multi_formats_img_tag(
|
||||
id : $id,
|
||||
lazy: true,
|
||||
)),
|
||||
'permalien' => $produit->get_permalink(),
|
||||
'prix' => $produit_commande->get_data()['total'],
|
||||
'quantite' => $produit_commande->get_quantity(),
|
||||
'titre' => $produit->get_title(),
|
||||
'permalien' => $produit->get_permalink(),
|
||||
'prix' => $produit_commande->get_data()['total'],
|
||||
'quantite' => $produit_commande->get_quantity(),
|
||||
'titre' => $produit->get_title(),
|
||||
];
|
||||
});
|
||||
|
||||
|
|
@ -103,10 +103,10 @@ try {
|
|||
function charge_scripts_styles_page_succes_commande(): void {
|
||||
wp_enqueue_style(
|
||||
handle: 'haiku-atelier-2024-styles-page-succes-commande',
|
||||
src: get_template_directory_uri() . '/assets/css/pages/page-succes-commande.css',
|
||||
deps: [],
|
||||
ver: filemtime(get_template_directory() . '/assets/css/pages/page-succes-commande.css'),
|
||||
media: 'all',
|
||||
src : get_template_directory_uri() . '/assets/css/pages/page-succes-commande.css',
|
||||
deps : [],
|
||||
ver : filemtime(get_template_directory() . '/assets/css/pages/page-succes-commande.css'),
|
||||
media : 'all',
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ use Timber\Timber;
|
|||
|
||||
use function add_action;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['cgv.twig'];
|
||||
|
||||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: '/assets/css/pages/page-modele-simple.css',
|
||||
path: '/assets/css/pages/page-modele-simple.css',
|
||||
path : '/assets/css/pages/page-modele-simple.css',
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ use function wc_get_product;
|
|||
use function wp_create_nonce;
|
||||
use function wp_json_encode;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['produit.twig'];
|
||||
|
||||
$raw_product = wc_get_product();
|
||||
|
|
@ -55,13 +55,13 @@ $same_collection_products = Product::get_same_collection_products($product->coll
|
|||
Product::from_wc_product(...),
|
||||
));
|
||||
|
||||
$context['product'] = $product;
|
||||
$context['product_json'] = wp_json_encode($product);
|
||||
$context['maximum_price'] = $maximum_price;
|
||||
$context['product'] = $product;
|
||||
$context['product_json'] = wp_json_encode($product);
|
||||
$context['maximum_price'] = $maximum_price;
|
||||
$context['same_collection_products'] = $same_collection_products;
|
||||
$product_tags = $raw_product->get_tag_ids()
|
||||
$product_tags = $raw_product->get_tag_ids()
|
||||
|> (static fn($tags_ids) => Arr::map($tags_ids, static fn($id) => Term::get_term_by_id(
|
||||
id: $id,
|
||||
id : $id,
|
||||
taxonomy: 'product_tag',
|
||||
)))
|
||||
|> (static fn(/** @var list<Option<WC_Term>> */ $tags) => Arr::reject($tags, static fn($tag) => $tag->isNone()))
|
||||
|
|
@ -70,11 +70,11 @@ $tags = get_terms(['taxonomy' => 'product_tag', 'hide_empty' => true]);
|
|||
|
||||
// Injecte les états initiaux des données du Produit sous forme de JSON dans le contexte.
|
||||
$page_states = [
|
||||
'nonce' => wp_create_nonce('wc_store_api'),
|
||||
'nonce' => wp_create_nonce('wc_store_api'),
|
||||
'product' => [
|
||||
'attributes' => $product->attributes,
|
||||
'id' => $product->id,
|
||||
'price' => $product->price,
|
||||
'id' => $product->id,
|
||||
'price' => $product->price,
|
||||
'variations' => $product->variations,
|
||||
],
|
||||
]
|
||||
|
|
@ -84,11 +84,11 @@ $context['page_states'] = $page_states;
|
|||
|
||||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-page-produit',
|
||||
id : 'haiku-atelier-2024-scripts-page-produit',
|
||||
path: '/assets/js/scripts-page-produit.js',
|
||||
);
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-menu-categories',
|
||||
id : 'haiku-atelier-2024-scripts-menu-categories',
|
||||
path: '/assets/js/scripts-menu-categories.js',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -51,8 +51,8 @@ final class StarterSite extends Site {
|
|||
|
||||
// Récupère les liens des réseaux sociaux définis dans la personnalisation du thème
|
||||
$personnalisations_theme = get_theme_mods();
|
||||
$liens_reseaux_sociaux = [
|
||||
'facebook' => ['nom' => 'Facebook', 'url' => $personnalisations_theme['lien_facebook'] ?? ''],
|
||||
$liens_reseaux_sociaux = [
|
||||
'facebook' => ['nom' => 'Facebook', 'url' => $personnalisations_theme['lien_facebook'] ?? ''],
|
||||
'instagram' => ['nom' => 'Instagram', 'url' => $personnalisations_theme['lien_instagram'] ?? ''],
|
||||
'pinterest' => ['nom' => 'Pinterest', 'url' => $personnalisations_theme['lien_pinterest'] ?? ''],
|
||||
];
|
||||
|
|
@ -61,14 +61,14 @@ final class StarterSite extends Site {
|
|||
// Récupère les textes apparaissant sur les pages Produits
|
||||
$descriptions_produits = [
|
||||
'texte_conditions_livraison' => wpautop($personnalisations_theme['texte_conditions_livraison']) ?? '',
|
||||
'texte_entretien_produit' => wpautop($personnalisations_theme['texte_entretien_produit']) ?? '',
|
||||
'texte_entretien_produit' => wpautop($personnalisations_theme['texte_entretien_produit']) ?? '',
|
||||
];
|
||||
$context['descriptions_produits'] = $descriptions_produits;
|
||||
|
||||
// Logo personnalisée
|
||||
$context['logo'] = pipe(get_theme_mod('custom_logo'), static fn($id) => wp_get_attachment_image_src(
|
||||
attachment_id: $id,
|
||||
size: 'full',
|
||||
size : 'full',
|
||||
));
|
||||
|
||||
// Informations des Pages
|
||||
|
|
@ -80,28 +80,27 @@ final class StarterSite extends Site {
|
|||
|
||||
// Pages spécifiques
|
||||
$context['pages'] = (object) [
|
||||
'about' => $recupere_informations_page('about'),
|
||||
'account' => $recupere_informations_page('account'),
|
||||
'cart' => $recupere_informations_page('cart'),
|
||||
'checkout' => $recupere_informations_page('checkout'),
|
||||
'contact' => $recupere_informations_page('contact'),
|
||||
'failed_order' => $recupere_informations_page('failed_order'),
|
||||
'home' => $recupere_informations_page('home'),
|
||||
'shop' => $recupere_informations_page('shop'),
|
||||
'about' => $recupere_informations_page('about'),
|
||||
'account' => $recupere_informations_page('account'),
|
||||
'cart' => $recupere_informations_page('cart'),
|
||||
'checkout' => $recupere_informations_page('checkout'),
|
||||
'contact' => $recupere_informations_page('contact'),
|
||||
'failed_order' => $recupere_informations_page('failed_order'),
|
||||
'home' => $recupere_informations_page('home'),
|
||||
'shop' => $recupere_informations_page('shop'),
|
||||
'successful_order' => $recupere_informations_page('successful_order'),
|
||||
];
|
||||
|
||||
// Récupère la Page courante
|
||||
$url_courante = URLHelper::get_current_url();
|
||||
$context['page_courante'] = $url_courante;
|
||||
$url_courante = URLHelper::get_current_url();
|
||||
$context['page_courante'] = $url_courante;
|
||||
$context['est_page_tous_produits'] = preg_match(pattern: '/(\bshop\b)/', subject: $url_courante);
|
||||
$context['est_page_boutique'] =
|
||||
preg_match(pattern: '/(\bshop\b)/', subject: $url_courante)
|
||||
|| preg_match(pattern: '/(\bproduct\b)/', subject: $url_courante)
|
||||
|| preg_match(pattern: '/(\bproduct-category\b)/', subject: $url_courante);
|
||||
$context['est_page_boutique'] = preg_match(pattern: '/(\bshop\b)/', subject: $url_courante)
|
||||
|| preg_match(pattern: '/(\bproduct\b)/', subject: $url_courante)
|
||||
|| preg_match(pattern: '/(\bproduct-category\b)/', subject: $url_courante);
|
||||
|
||||
// Politique de confidentialité
|
||||
$politique_confidentialite_lien = pipe(get_privacy_policy_url(), esc_url(...));
|
||||
$politique_confidentialite_lien = pipe(get_privacy_policy_url(), esc_url(...));
|
||||
$context['lien_politique_confidentialite'] = $politique_confidentialite_lien;
|
||||
|
||||
// Chemin de base pour une Catégorie de Produit (p. ex. /product-category/<produit>)
|
||||
|
|
@ -109,7 +108,7 @@ final class StarterSite extends Site {
|
|||
|
||||
// Récupère les Catégories de Produits
|
||||
$cree_entree_menu = static fn($categorie): array => [
|
||||
'nom' => $categorie->name,
|
||||
'nom' => $categorie->name,
|
||||
'slug' => $categorie->slug,
|
||||
// Détermine si l'URL courante est celle de la Page d'Archive d'une Catégorie de Produits
|
||||
'courante' => preg_match(
|
||||
|
|
@ -125,16 +124,16 @@ final class StarterSite extends Site {
|
|||
$context['categories_produits'] = $entrees_menu_categories;
|
||||
|
||||
// Récupère le Panier de l'Utilisateur
|
||||
$panier = WC()?->cart?->get_cart();
|
||||
$panier = WC()?->cart?->get_cart();
|
||||
$quantite_articles = WC()?->cart?->get_cart_contents_count();
|
||||
$articles_presents = $quantite_articles > 0 ? 'true' : 'false';
|
||||
|
||||
$context['panier'] = $panier;
|
||||
$context['panier'] = $panier;
|
||||
$context['quantite_articles'] = $quantite_articles;
|
||||
$context['articles_presents'] = $articles_presents;
|
||||
|
||||
// Nonce WooCommerce pour l'API Rest
|
||||
$nonce_wc = wp_create_nonce('wc_store_api');
|
||||
$nonce_wc = wp_create_nonce('wc_store_api');
|
||||
$context['nonce_wc'] = $nonce_wc;
|
||||
// TODO: Utiliser des variables d'environnement
|
||||
$auth_string = base64_encode(
|
||||
|
|
|
|||
|
|
@ -28,9 +28,9 @@ function cree_champs_personnalises_produit(): void {
|
|||
|
||||
function cree_champ_personnalise_commande($order): void {
|
||||
woocommerce_wp_text_input([
|
||||
'id' => 'tracking_number',
|
||||
'label' => 'Tracking Number:',
|
||||
'value' => $order->get_meta('tracking_number'),
|
||||
'id' => 'tracking_number',
|
||||
'label' => 'Tracking Number:',
|
||||
'value' => $order->get_meta('tracking_number'),
|
||||
'wrapper_class' => 'form-field-wide',
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,10 +27,10 @@ function enregistre_controle_personnalise_tinymce(): void {
|
|||
public function enqueue(): void {
|
||||
wp_enqueue_script(
|
||||
handle: 'controle-personnalise-tinymce',
|
||||
src: get_template_directory_uri() . '/assets/vendor/controle-personnalise-tinymce.js',
|
||||
deps: ['jquery'],
|
||||
ver: '1.3',
|
||||
args: true,
|
||||
src : get_template_directory_uri() . '/assets/vendor/controle-personnalise-tinymce.js',
|
||||
deps : ['jquery'],
|
||||
ver : '1.3',
|
||||
args : true,
|
||||
);
|
||||
wp_enqueue_editor();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ final readonly class Attribute {
|
|||
public function __construct(
|
||||
public string $name,
|
||||
public string $slug,
|
||||
public array $options,
|
||||
public array $options,
|
||||
) {}
|
||||
|
||||
/**
|
||||
|
|
@ -26,8 +26,10 @@ final readonly class Attribute {
|
|||
public static function new(WC_Product_Attribute $attribute): self {
|
||||
$name = wc_attribute_label($attribute->get_name());
|
||||
$slug = $attribute->get_name();
|
||||
|
||||
/** @var list<WP_Term> */
|
||||
$terms = $attribute->get_terms() ?? [];
|
||||
|
||||
/** @var list<AttributeOption> */
|
||||
$options = Arr::map($terms, AttributeOption::new(...))
|
||||
|> (static fn($options) => Arr::sort($options, static fn($attribute) => $attribute->id))
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ use WP_Term;
|
|||
|
||||
final readonly class AttributeOption {
|
||||
public function __construct(
|
||||
public int $id,
|
||||
public int $id,
|
||||
public string $name,
|
||||
public string $slug,
|
||||
) {}
|
||||
|
|
@ -17,7 +17,7 @@ final readonly class AttributeOption {
|
|||
* Créé une nouvelle instance de `AttributeOption` depuis un `WP_Term`.
|
||||
*/
|
||||
public static function new(WP_Term $term): self {
|
||||
$id = $term->term_taxonomy_id;
|
||||
$id = $term->term_taxonomy_id;
|
||||
$name = $term->name;
|
||||
$slug = $term->slug;
|
||||
|
||||
|
|
|
|||
|
|
@ -112,10 +112,10 @@ final readonly class Cart {
|
|||
|
||||
private static function format_number(int|float $number): string {
|
||||
$formatted_number = Number::format(
|
||||
number: $number,
|
||||
number : $number,
|
||||
// precision et max_precision sont mutuellement exclusifs.
|
||||
precision: 2,
|
||||
locale: 'fr',
|
||||
locale : 'fr',
|
||||
);
|
||||
|
||||
return is_bool($formatted_number) ? self::DEFAULT_VALUE : $formatted_number;
|
||||
|
|
|
|||
|
|
@ -18,28 +18,31 @@ use function Psl\Option\from_nullable;
|
|||
use function wc_get_products;
|
||||
use function wpautop;
|
||||
|
||||
/**
|
||||
* Représente un **Produit** (selon _WooCommerce_) avec de nombreuses données d'intérêt pour les opérations courantes.
|
||||
*/
|
||||
final readonly class Product {
|
||||
/**
|
||||
* @param list<Attribute> $attributes
|
||||
* @param list<Attribute> $attributes La liste des `Attribute` appliquées.
|
||||
* @param list<string> $left_column_photos
|
||||
* @param list<string> $right_column_photos
|
||||
* @param array<ProductVariation> $variations
|
||||
*/
|
||||
private function __construct(
|
||||
public array $attributes,
|
||||
public array $attributes,
|
||||
public string $category,
|
||||
public string $collection,
|
||||
public string $details,
|
||||
public int $id,
|
||||
public int $id,
|
||||
public string $name,
|
||||
public string $price,
|
||||
public array $left_column_photos,
|
||||
public array $right_column_photos,
|
||||
public array $left_column_photos,
|
||||
public array $right_column_photos,
|
||||
public string $default_photo,
|
||||
public string $hover_photo,
|
||||
public string $slug,
|
||||
public int $stock,
|
||||
public array $variations,
|
||||
public int $stock,
|
||||
public array $variations,
|
||||
public string $url,
|
||||
) {}
|
||||
|
||||
|
|
@ -59,17 +62,17 @@ final readonly class Product {
|
|||
|
||||
/** @var string */
|
||||
$details = $product->get_description() |> wpautop(...);
|
||||
$id = $product->get_id();
|
||||
$name = $product->get_name();
|
||||
$price = $product->get_price();
|
||||
$id = $product->get_id();
|
||||
$name = $product->get_name();
|
||||
$price = $product->get_price();
|
||||
/** @var list<string> */
|
||||
$left_column_photos = HaikuProduct::get_left_column_photos($id);
|
||||
/** @var list<string> */
|
||||
$right_column_photos = HaikuProduct::get_right_column_photos($id);
|
||||
$default_photo = $left_column_photos[0] ?? Resource::output_multi_formats_img_tag('-1');
|
||||
$hover_photo = $right_column_photos[0] ?? Resource::output_multi_formats_img_tag('-1', true);
|
||||
$slug = $product->get_slug();
|
||||
$stock = $product->get_stock_quantity() ?? 1;
|
||||
$default_photo = $left_column_photos[0] ?? Resource::output_multi_formats_img_tag('-1');
|
||||
$hover_photo = $right_column_photos[0] ?? Resource::output_multi_formats_img_tag('-1', true);
|
||||
$slug = $product->get_slug();
|
||||
$stock = $product->get_stock_quantity() ?? 1;
|
||||
/** @var array<ProductVariation> */
|
||||
$variations = $product->get_children()
|
||||
|> (static fn(/** @var list<int> */ array $ids): array => Arr::map($ids, wc_get_product(...)))
|
||||
|
|
@ -80,21 +83,21 @@ final readonly class Product {
|
|||
$url = $product->get_permalink();
|
||||
|
||||
return new self(
|
||||
attributes: $attributes,
|
||||
category: $category,
|
||||
collection: $collection,
|
||||
details: $details,
|
||||
id: $id,
|
||||
name: $name,
|
||||
price: $price,
|
||||
left_column_photos: $left_column_photos,
|
||||
attributes : $attributes,
|
||||
category : $category,
|
||||
collection : $collection,
|
||||
details : $details,
|
||||
id : $id,
|
||||
name : $name,
|
||||
price : $price,
|
||||
left_column_photos : $left_column_photos,
|
||||
right_column_photos: $right_column_photos,
|
||||
default_photo: $default_photo,
|
||||
hover_photo: $hover_photo,
|
||||
slug: $slug,
|
||||
stock: $stock,
|
||||
variations: $variations,
|
||||
url: $url,
|
||||
default_photo : $default_photo,
|
||||
hover_photo : $hover_photo,
|
||||
slug : $slug,
|
||||
stock : $stock,
|
||||
variations : $variations,
|
||||
url : $url,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -115,21 +118,21 @@ final readonly class Product {
|
|||
*/
|
||||
public static function get_same_collection_products(string $slug_collection): callable {
|
||||
return static fn(int $id_produit): array|stdClass => wc_get_products([
|
||||
'exclude' => [$id_produit],
|
||||
'limit' => 4,
|
||||
'order' => 'DESC',
|
||||
'orderby' => 'date',
|
||||
'status' => 'publish',
|
||||
'exclude' => [$id_produit],
|
||||
'limit' => 4,
|
||||
'order' => 'DESC',
|
||||
'orderby' => 'date',
|
||||
'status' => 'publish',
|
||||
'tax_query' => [['taxonomy' => 'collection', 'field' => 'slug', 'terms' => $slug_collection]],
|
||||
]);
|
||||
}
|
||||
|
||||
public static function recupere_et_formate_attributs_produit(mixed $attributs_produit): mixed {
|
||||
return [
|
||||
'cote' => ['nom' => 'Side', 'valeur' => $attributs_produit['pa_side'] ?? false],
|
||||
'cote' => ['nom' => 'Side', 'valeur' => $attributs_produit['pa_side'] ?? false],
|
||||
'materiel' => ['nom' => 'Material', 'valeur' => $attributs_produit['pa_material-workshop'] ?? false],
|
||||
'pierre' => ['nom' => 'Stone', 'valeur' => $attributs_produit['pa_stone'] ?? false],
|
||||
'taille' => ['nom' => 'Size', 'valeur' => $attributs_produit['pa_size'] ?? false],
|
||||
'pierre' => ['nom' => 'Stone', 'valeur' => $attributs_produit['pa_stone'] ?? false],
|
||||
'taille' => ['nom' => 'Size', 'valeur' => $attributs_produit['pa_size'] ?? false],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,16 +13,16 @@ final readonly class ProductVariation {
|
|||
* @param list<ProductVariationAttribute> $attributes Les attributs appliqués à la Variation
|
||||
*/
|
||||
private function __construct(
|
||||
public int $id,
|
||||
public int $id,
|
||||
public string $price,
|
||||
public array $attributes,
|
||||
public array $attributes,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Créé une nouvelle instance de `ProductVariation` depuis un `WC_Product`.
|
||||
*/
|
||||
public static function new(WC_Product $product): self {
|
||||
$id = $product->get_id();
|
||||
$id = $product->get_id();
|
||||
$price = $product->get_price();
|
||||
/** @var list<ProductVariationAttribute> */
|
||||
$attributes = array_map(
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ function desactive_transformation_contenu_tinymce(array $configuration): array {
|
|||
* @return array<string, string> le même tableau avec SVG en plus
|
||||
*/
|
||||
function autorise_import_svg_mediatheque(array $file_types): array {
|
||||
$new_filetypes = [];
|
||||
$new_filetypes = [];
|
||||
$new_filetypes['svg'] = 'image/svg+xml';
|
||||
|
||||
return [...$file_types, ...$new_filetypes];
|
||||
|
|
|
|||
|
|
@ -143,11 +143,11 @@ function genere_balises_img_dans_produit_dans_reponse_rest(
|
|||
$response->data['image_repos'] = pipe(
|
||||
$response->data['meta_data'],
|
||||
static fn($metadata): array => array_filter(
|
||||
array: $metadata,
|
||||
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,
|
||||
id : $entree?->value,
|
||||
lazy: true,
|
||||
)),
|
||||
static fn($image) => array_values(array: $image)[0],
|
||||
|
|
@ -157,11 +157,11 @@ function genere_balises_img_dans_produit_dans_reponse_rest(
|
|||
$response->data['image_survol'] = pipe(
|
||||
$response->data['meta_data'],
|
||||
static fn($metadata): array => array_filter(
|
||||
array: $metadata,
|
||||
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,
|
||||
id : $entree?->value,
|
||||
lazy: true,
|
||||
)),
|
||||
static fn($image) => array_values(array: $image)[0],
|
||||
|
|
|
|||
|
|
@ -16,27 +16,27 @@ use function register_taxonomy;
|
|||
*/
|
||||
function enregistre_taxonomie_collection(): void {
|
||||
$labels = [
|
||||
'add_new_item' => __('Add New Collection'),
|
||||
'all_items' => __('All Collections'),
|
||||
'edit_item' => __('Edit Collection'),
|
||||
'menu_name' => __('Collections'),
|
||||
'name' => __('Collections'),
|
||||
'add_new_item' => __('Add New Collection'),
|
||||
'all_items' => __('All Collections'),
|
||||
'edit_item' => __('Edit Collection'),
|
||||
'menu_name' => __('Collections'),
|
||||
'name' => __('Collections'),
|
||||
'new_item_name' => __('New Collection Name'),
|
||||
'search_items' => __('Search Collections'),
|
||||
'search_items' => __('Search Collections'),
|
||||
'singular_name' => __('Collection'),
|
||||
'update_item' => __('Update Collection'),
|
||||
'update_item' => __('Update Collection'),
|
||||
];
|
||||
$args = [
|
||||
'description' => __('An ensemble of pieces thematically or chronologically grouped together.'),
|
||||
'hierarchical' => false,
|
||||
'labels' => $labels,
|
||||
'description' => __('An ensemble of pieces thematically or chronologically grouped together.'),
|
||||
'hierarchical' => false,
|
||||
'labels' => $labels,
|
||||
'publicly_queryable' => false,
|
||||
'query_var' => true,
|
||||
'rewrite' => ['slug' => 'collection'],
|
||||
'show_admin_column' => true,
|
||||
'show_in_menu' => true,
|
||||
'query_var' => true,
|
||||
'rewrite' => ['slug' => 'collection'],
|
||||
'show_admin_column' => true,
|
||||
'show_in_menu' => true,
|
||||
'show_in_quick_edit' => true,
|
||||
'show_ui' => true,
|
||||
'show_ui' => true,
|
||||
];
|
||||
|
||||
register_taxonomy('collection', ['product'], $args);
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ final readonly class Resource {
|
|||
public static function enqueue_script_module_file(string $path, string $id): void {
|
||||
$file_uri = get_template_directory_uri() . $path;
|
||||
|
||||
$file_path = get_template_directory() . $path;
|
||||
$file_path = get_template_directory() . $path;
|
||||
$file_mtime = filemtime($file_path);
|
||||
|
||||
if (is_bool($file_mtime)) {
|
||||
|
|
@ -39,7 +39,7 @@ final readonly class Resource {
|
|||
public static function enqueue_style_file(string $path, string $handle): void {
|
||||
$file_uri = get_template_directory_uri() . $path;
|
||||
|
||||
$file_path = get_template_directory() . $path;
|
||||
$file_path = get_template_directory() . $path;
|
||||
$file_mtime = filemtime($file_path);
|
||||
|
||||
if (is_bool($file_mtime)) {
|
||||
|
|
@ -66,30 +66,29 @@ final readonly class Resource {
|
|||
return '';
|
||||
}
|
||||
|
||||
$url = wp_get_attachment_image_url($int_id, 'full');
|
||||
$chemin = realpath(get_attached_file($int_id)) ?: realpath(get_attached_file($int_id));
|
||||
$alt = get_post_meta($int_id, '_wp_attachment_image_alt', true);
|
||||
$url = wp_get_attachment_image_url($int_id, 'full');
|
||||
$chemin = realpath(get_attached_file($int_id)) ?: realpath(get_attached_file($int_id));
|
||||
$alt = get_post_meta($int_id, '_wp_attachment_image_alt', true);
|
||||
$dimensions = $chemin ? getimagesize($chemin) : ['', ''];
|
||||
|
||||
$avif = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.avif') : false;
|
||||
$jxl = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.jxl') : false;
|
||||
$jxl = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.jxl') : false;
|
||||
|
||||
// Génère un tableau avec les différents formats valides
|
||||
$formats = pipe(
|
||||
[$avif, $jxl],
|
||||
static fn($tableau): array => array_filter(
|
||||
array: $tableau,
|
||||
array : $tableau,
|
||||
callback: static fn($chemin_format): bool => false !== $chemin_format,
|
||||
),
|
||||
static fn($tableau): array => array_map(array: $tableau, callback: static fn($chemin_format): array => [
|
||||
'format' => pathinfo((string) $chemin_format)['extension'],
|
||||
'taille' => filesize($chemin_format),
|
||||
'url' =>
|
||||
pathinfo($url)['dirname']
|
||||
. '/'
|
||||
. pathinfo($url)['filename']
|
||||
. '.'
|
||||
. pathinfo((string) $chemin_format)['extension'],
|
||||
'url' => pathinfo($url)['dirname']
|
||||
. '/'
|
||||
. pathinfo($url)['filename']
|
||||
. '.'
|
||||
. pathinfo((string) $chemin_format)['extension'],
|
||||
]),
|
||||
);
|
||||
usort(array: $formats, callback: static fn($a, $b): int => $a['taille'] <=> $b['taille']);
|
||||
|
|
@ -97,8 +96,8 @@ final readonly class Resource {
|
|||
// Construis les balises <source> avec les formats valides
|
||||
$sources = '';
|
||||
foreach ($formats as $format) {
|
||||
$height = $dimensions[0];
|
||||
$width = $dimensions[1];
|
||||
$height = $dimensions[0];
|
||||
$width = $dimensions[1];
|
||||
$sources .= "<source height='{$height}' srcset='{$format['url']}' type='image/{$format['format']}' width='{$width}' />\n";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ use function wc_get_products;
|
|||
use function wp_create_nonce;
|
||||
use function wp_json_encode;
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['boutique.twig'];
|
||||
|
||||
/** @var WP_Term La Catégorie affichée. */
|
||||
|
|
@ -35,10 +35,10 @@ $current_term = get_queried_object();
|
|||
/** @var list<Product> Les Produits de la Catégorie affichée. */
|
||||
$products = wc_get_products([
|
||||
'category' => [$current_term->slug],
|
||||
'limit' => 12,
|
||||
'order' => 'DESC',
|
||||
'orderby' => 'date',
|
||||
'status' => 'publish',
|
||||
'limit' => 12,
|
||||
'order' => 'DESC',
|
||||
'orderby' => 'date',
|
||||
'status' => 'publish',
|
||||
])
|
||||
|> function (/** @var list<WC_Product>|stdClass */ mixed $products): array {
|
||||
assert(is_array($products), 'Les Produits de la Catégorie doivent être un tableau.');
|
||||
|
|
@ -50,12 +50,12 @@ $products = wc_get_products([
|
|||
Product::from_wc_product(...),
|
||||
));
|
||||
|
||||
$context['products'] = $products;
|
||||
$context['products'] = $products;
|
||||
$context['category_id'] = $current_term->term_id;
|
||||
|
||||
// Injecte les états initiaux des données du Produit sous forme de JSON dans le contexte.
|
||||
$page_states = [
|
||||
'nonce' => wp_create_nonce('wc_store_api'),
|
||||
'nonce' => wp_create_nonce('wc_store_api'),
|
||||
'authString' => base64_encode(
|
||||
Config::get('WOOCOMMERCE_API_CONSUMER_KEY') . ':' . Config::get('WOOCOMMERCE_API_CONSUMER_SECRET'),
|
||||
),
|
||||
|
|
@ -67,14 +67,14 @@ $context['page_states'] = $page_states;
|
|||
add_action('wp_enqueue_scripts', function (): void {
|
||||
Resource::enqueue_style_file(
|
||||
handle: 'haiku-atelier-2024-styles-page-boutique',
|
||||
path: '/assets/css/pages/page-boutique.css',
|
||||
path : '/assets/css/pages/page-boutique.css',
|
||||
);
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-page-boutique',
|
||||
id : 'haiku-atelier-2024-scripts-page-boutique',
|
||||
path: '/assets/js/scripts-page-boutique.js',
|
||||
);
|
||||
Resource::enqueue_script_module_file(
|
||||
id: 'haiku-atelier-2024-scripts-menu-categories',
|
||||
id : 'haiku-atelier-2024-scripts-menu-categories',
|
||||
path: '/assets/js/scripts-menu-categories.js',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ Timber::init();
|
|||
// Sélectionne le répertoire contenant les modèles Twig
|
||||
Timber::$dirname = ['views'];
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['email-commande-envoyee.twig'];
|
||||
|
||||
/** @var Order $commande La Commande issue du contexte contenu dans la variable $order. */
|
||||
|
|
@ -30,7 +30,7 @@ $commande = $order;
|
|||
$date = new Carbon($commande->get_date_created());
|
||||
|
||||
$email = [
|
||||
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
||||
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
||||
'livraison' => [
|
||||
'transporteur' => Str::of($commande->get_shipping_method())->replace(' (Free)', ''),
|
||||
'numero_suivi' => blank($commande->get_meta('tracking_number'))
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ Timber::init();
|
|||
// Sélectionne le répertoire contenant les modèles Twig
|
||||
Timber::$dirname = ['views'];
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['email-base.twig'];
|
||||
|
||||
/** @var Order $commande La Commande issue du contexte contenu dans la variable $order. */
|
||||
|
|
@ -31,14 +31,17 @@ $commande = $order;
|
|||
$date = new Carbon($commande->get_date_created());
|
||||
|
||||
$email = [
|
||||
'adresses' => ['facturation' => $commande->get_address('billing'), 'livraison' => $commande->get_address('shipping')],
|
||||
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
||||
'adresses' => [
|
||||
'facturation' => $commande->get_address('billing'),
|
||||
'livraison' => $commande->get_address('shipping'),
|
||||
],
|
||||
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
||||
'livraison' => [
|
||||
'methode' => $commande->get_shipping_method(),
|
||||
'methode' => $commande->get_shipping_method(),
|
||||
'numero_suivi' => $commande->get_meta('tracking_number'),
|
||||
],
|
||||
'paiement' => ['methode' => ''],
|
||||
'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) {
|
||||
'paiement' => ['methode' => ''],
|
||||
'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) {
|
||||
$produit = $article->get_product();
|
||||
|
||||
if (is_bool($produit) || $produit === null) {
|
||||
|
|
@ -47,31 +50,31 @@ $email = [
|
|||
|
||||
return [
|
||||
// Récupère l'Attribut d'un Produit variable ou renvoie un tableau vide
|
||||
'attribut' => $produit->is_type('variable')
|
||||
'attribut' => $produit->is_type('variable')
|
||||
? collect($produit->get_attributes())
|
||||
->mapWithKeys(static fn($_atr, $cle): array => [
|
||||
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
||||
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
||||
'valeur' => $produit->get_attribute($cle),
|
||||
])
|
||||
->toArray()
|
||||
: [],
|
||||
'lien' => $produit->get_permalink(),
|
||||
'nom' => $produit->get_title(),
|
||||
'lien' => $produit->get_permalink(),
|
||||
'nom' => $produit->get_title(),
|
||||
'prix_total' => $article->get_total(),
|
||||
'quantite' => $article->get_quantity(),
|
||||
'quantite' => $article->get_quantity(),
|
||||
];
|
||||
}),
|
||||
'totaux' => [
|
||||
'totaux' => [
|
||||
'sous_total_livraison' => '0' === $commande->get_shipping_total() ? 'Free' : $commande->get_shipping_total() . '€',
|
||||
'sous_total_produits' => $commande->get_subtotal() . '€',
|
||||
'sous_total_produits' => $commande->get_subtotal() . '€',
|
||||
'sous_total_reduction' => '0.00' === $commande->get_discount_total()
|
||||
? '0'
|
||||
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
|
||||
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
||||
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
||||
],
|
||||
];
|
||||
// Transforme les codes de pays en noms de pays
|
||||
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
||||
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
||||
$email['adresses']['facturation']['country'] = WC()->countries->countries[$commande->get_billing_country()];
|
||||
|
||||
$context['commande'] = $email;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ Timber::init();
|
|||
// Sélectionne le répertoire contenant les modèles Twig
|
||||
Timber::$dirname = ['views'];
|
||||
|
||||
$context = Timber::context();
|
||||
$context = Timber::context();
|
||||
$templates = ['email-commande-recue.twig'];
|
||||
|
||||
/** @var Order $commande La Commande issue du contexte contenu dans la variable $order. */
|
||||
|
|
@ -43,31 +43,31 @@ $email = [
|
|||
|
||||
return [
|
||||
// Récupère l'Attribut d'un Produit variable ou renvoie un tableau vide
|
||||
'attribut' => $article->is_type('variable')
|
||||
'attribut' => $article->is_type('variable')
|
||||
? collect($produit->get_attributes())
|
||||
->mapWithKeys(static fn($_atr, $cle): array => [
|
||||
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
||||
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
||||
'valeur' => $produit->get_attribute($cle),
|
||||
])
|
||||
->toArray()
|
||||
: [],
|
||||
'lien' => $produit->get_permalink(),
|
||||
'nom' => $produit->get_title(),
|
||||
'lien' => $produit->get_permalink(),
|
||||
'nom' => $produit->get_title(),
|
||||
'prix_total' => $article->get_total(),
|
||||
'quantite' => $article->get_quantity(),
|
||||
'quantite' => $article->get_quantity(),
|
||||
];
|
||||
}),
|
||||
'totaux' => [
|
||||
'totaux' => [
|
||||
'sous_total_livraison' => '0' === $commande->get_shipping_total() ? 'Free' : $commande->get_shipping_total() . '€',
|
||||
'sous_total_produits' => $commande->get_subtotal() . '€',
|
||||
'sous_total_produits' => $commande->get_subtotal() . '€',
|
||||
'sous_total_reduction' => '0.00' === $commande->get_discount_total()
|
||||
? '0'
|
||||
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
|
||||
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
||||
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
||||
],
|
||||
];
|
||||
// Transforme les codes de pays en noms de pays
|
||||
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
||||
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
||||
$email['adresses']['facturation']['country'] = WC()->countries->countries[$commande->get_billing_country()];
|
||||
|
||||
$context['commande'] = $email;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue