diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..c8e2625 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Xdebug", + "pathMappings": { + "/var/www/html": "${workspaceFolder}/.." + }, + "port": 9003, + "request": "launch", + "type": "php", + "xdebugSettings": { + "max_data": 0 + } + } + ] +} \ No newline at end of file diff --git a/wp-content/themes/headless/.hygen.cjs b/wp-content/themes/headless/.hygen.cjs new file mode 100644 index 0000000..caf49fc --- /dev/null +++ b/wp-content/themes/headless/.hygen.cjs @@ -0,0 +1,7 @@ +module.exports = { + templates: `../kaliroots/_templates`, + helpers: { + description: "Headless", + textdomain: "headless", + }, +}; diff --git a/wp-content/themes/headless/acf-json/group_abstract_builder.json b/wp-content/themes/headless/acf-json/group_abstract_builder.json index 4817b08..1f0e8f4 100644 --- a/wp-content/themes/headless/acf-json/group_abstract_builder.json +++ b/wp-content/themes/headless/acf-json/group_abstract_builder.json @@ -93,6 +93,67 @@ "acfe_flexible_render_script": false, "acfe_flexible_thumbnail": false, "acfe_flexible_category": false + }, + "layout_69c69985e74f4": { + "key": "layout_69c69985e74f4", + "name": "template", + "label": "Modèle", + "display": "block", + "sub_fields": [ + { + "key": "field_69c6998ce74f6", + "label": "Modèle", + "name": "template", + "aria-label": "", + "type": "post_object", + "instructions": "", + "required": 1, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "post_type": [ + "template" + ], + "post_status": [ + "publish" + ], + "taxonomy": "", + "return_format": "id", + "multiple": 0, + "save_custom": 0, + "save_post_status": "publish", + "acfe_bidirectional": { + "acfe_bidirectional_enabled": "0" + }, + "allow_null": 0, + "allow_in_bindings": 0, + "bidirectional": 0, + "show_in_graphql": 1, + "graphql_description": "", + "graphql_field_name": "template", + "graphql_connection_type": "one_to_one", + "ui": 1, + "bidirectional_target": [], + "save_post_type": "" + } + ], + "min": "", + "max": "", + "acfe_flexible_modal_edit_size": "", + "acfe_flexible_settings": [ + "group_layout_padding", + "group_layout_container", + "group_layout_color" + ], + "acfe_flexible_settings_size": "", + "acfe_flexible_render_template": false, + "acfe_flexible_render_style": false, + "acfe_flexible_render_script": false, + "acfe_flexible_thumbnail": false, + "acfe_flexible_category": false } }, "min": "", @@ -134,5 +195,5 @@ "graphql_types": "", "acfe_meta": "", "acfe_note": "", - "modified": 1774617029 + "modified": 1774623170 } diff --git a/wp-content/themes/headless/acf-json/group_post_template.json b/wp-content/themes/headless/acf-json/group_post_template.json new file mode 100644 index 0000000..d751780 --- /dev/null +++ b/wp-content/themes/headless/acf-json/group_post_template.json @@ -0,0 +1,66 @@ +{ + "key": "group_post_template", + "title": "Post - Template", + "fields": [ + { + "key": "field_690cbda0abcbb", + "label": "Constructeur de page", + "name": "builder", + "aria-label": "", + "type": "clone", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "graphql_field_name": "builder", + "clone": [ + "group_abstract_builder" + ], + "display": "seamless", + "layout": "block", + "prefix_label": 0, + "prefix_name": 1, + "acfe_seamless_style": 0, + "acfe_clone_modal": 0, + "acfe_clone_modal_close": 0, + "acfe_clone_modal_button": "", + "acfe_clone_modal_size": "large" + } + ], + "location": [ + [ + { + "param": "post_type", + "operator": "==", + "value": "template" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "seamless", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": [ + "the_content" + ], + "active": true, + "description": "", + "show_in_rest": 0, + "display_title": "", + "acfe_autosync": [ + "json" + ], + "acfe_form": 0, + "show_in_graphql": 1, + "graphql_field_name": "GroupTemplate", + "map_graphql_types_from_location_rules": 0, + "graphql_types": "", + "acfe_meta": "", + "acfe_note": "", + "modified": 1774624640 +} diff --git a/wp-content/themes/headless/functions.php b/wp-content/themes/headless/functions.php index 083a2c8..b2ecacc 100644 --- a/wp-content/themes/headless/functions.php +++ b/wp-content/themes/headless/functions.php @@ -3,6 +3,9 @@ // Core require_once __DIR__ . '/includes/core/theme-setup.php'; +// Custom Post Types +require_once __DIR__ . '/includes/cpt/template.php'; + // Vendors require_once __DIR__ . '/includes/vendors/acf.php'; require_once __DIR__ . '/includes/vendors/rankmath.php'; diff --git a/wp-content/themes/headless/includes/cpt/template.php b/wp-content/themes/headless/includes/cpt/template.php new file mode 100644 index 0000000..7e64c65 --- /dev/null +++ b/wp-content/themes/headless/includes/cpt/template.php @@ -0,0 +1,130 @@ + array( + 'name' => "Modèles", + 'menu_name' => "Modèles", + 'singular_name' => "Modèle", + 'add_new' => "Ajouter", + 'add_new_item' => "Ajouter un modèle", + 'new_item' => "Nouveau modèle", + 'edit_item' => "Modifier le modèle", + 'view_item' => "Voir le modèle", + 'view_items' => "Voir les modèles", + 'search_items' => "Rechercher des modèles", + 'not_found' => "Aucun modèle trouvé", + 'not_found_in_trash' => "Aucun modèle trouvé dans la corbeille", + 'parent_item_colon' => "Modèle parent :", + 'all_items' => "Tous les modèles", + 'archives' => "Archives des modèles", + 'attributes' => "Attributs du modèle", + 'insert_into_item' => "Insérer dans le modèle", + 'uploaded_to_this_item' => "Téléversé dans ce modèle", + 'featured_image' => "Vignette", + 'set_featured_image' => "Définir la vignette", + 'remove_featured_image' => "Supprimer la vignette", + 'use_featured_image' => "Utiliser comme vignette", + 'filter_items_list' => "Filtrer la liste des modèles", + 'items_list_navigation' => "Navigation dans la liste des modèles", + 'items_list' => "Liste des modèles", + 'item_published' => "Modèle publié.", + 'item_published_privately' => "Modèle publié en privé.", + 'item_reverted_to_draft' => "Modèle remis au brouillon.", + 'item_scheduled' => "Modèle planifié.", + 'item_updated' => "Modèle mis à jour.", + ), + 'public' => false, + 'hierarchical' => false, + 'show_ui' => true, + 'show_in_nav_menus' => false, + 'supports' => array( 'title', 'revisions' ), + 'has_archive' => false, + 'rewrite' => false, + 'query_var' => true, + 'menu_icon' => 'dashicons-clipboard', + 'show_in_rest' => false, + 'rest_base' => 'template', + 'rest_controller_class' => 'WP_REST_Posts_Controller', + 'show_in_graphql' => true, + 'graphql_single_name' => "Template", + 'graphql_plural_name' => "Templates", + 'graphql_interfaces' => array( 'Node' ), + ) + ); +} + +// Custom 'template' post updated messages +add_filter( 'post_updated_messages', 'headless_template_post_updated_messages' ); +function headless_template_post_updated_messages( $messages ) { + global $post; + $permalink = get_permalink( $post ); + $preview_post_link_html = sprintf( ' %2$s', esc_url( get_preview_post_link( $post ) ), "Prévisualiser le modèle" ); + $scheduled_post_link_html = sprintf( ' %2$s', esc_url( $permalink ), "Prévisualiser le modèle" ); + $scheduled_date = date_i18n( "j M Y à H:i", strtotime( $post->post_date ) ); + $view_post_link_html = sprintf( ' %2$s', esc_url( $permalink ), "Voir le modèle" ); + $messages['template'] = array( + 0 => '', + 1 => "Modèle mis à jour." . $view_post_link_html, + 2 => "Champ personnalisé mis à jour.", + 3 => "Champ personnalisé supprimé.", + 4 => "Modèle mis à jour.", + 5 => isset( $_GET['revision'] ) ? sprintf( "Modèle restauré à partir de la révision du %s", wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, + 6 => "Modèle publié." . $view_post_link_html, + 7 => "Modèle enregistré.", + 8 => "Modèle soumis." . $preview_post_link_html, + 9 => sprintf( "Modèle planifié pour le : %s.", '' . $scheduled_date . '' ) . $scheduled_post_link_html, + 10 => "Brouillon du modèle mis à jour." . $preview_post_link_html, + ); + + return $messages; +} + +// Helper: Replace template(s) in sections value recursively +function headless_template_replace_sections( $sections ) { + if ( ! is_array( $sections ) ) { + return $sections; + } + + $processed_sections = array(); + foreach ( $sections as $section ) { + if ( empty( $layout = $section['acf_fc_layout'] ?? false ) ) { + continue; + } + + if ( $layout !== 'template' ) { + $processed_sections[] = $section; + continue; + } + + if ( empty( $template_id = $section['template'] ?? false ) ) { + continue; + } + + $template_sections = get_field( 'builder_sections', $template_id ); + if ( is_array( $template_sections ) ) { + $expanded_sections = headless_template_replace_sections( $template_sections ); + foreach ( $expanded_sections as $expanded_section ) { + $processed_sections[] = $expanded_section; + } + } + } + + return $processed_sections; +} + +// Replace template(s) in GraphQL builder sections value +add_filter( 'wpgraphql/acf/field_value', 'headless_graphql_process_sections', 10, 2 ); +function headless_graphql_process_sections( $value, $field_config ) { + if ( 'builder' !== $field_config['name'] ?? false || ! is_array( $value['sections'] ?? false ) ) { + return $value; + } + + $value['sections'] = headless_template_replace_sections( $value['sections'] ); + + return $value; +} diff --git a/wp-content/themes/headless/nuxt.config.ts b/wp-content/themes/headless/nuxt.config.ts index dabd9f1..2a97c53 100644 --- a/wp-content/themes/headless/nuxt.config.ts +++ b/wp-content/themes/headless/nuxt.config.ts @@ -31,9 +31,8 @@ export default defineNuxtConfig({ graphql: { client: { - cache: { - keyVersion: version, - }, + cache: { keyVersion: version }, + ssrForwardHeaders: ["authorization", "cookie"], }, server: { context: ["server/graphql/context.ts"],