feat: Template CPT and section
This commit is contained in:
130
wp-content/themes/headless/includes/cpt/template.php
Normal file
130
wp-content/themes/headless/includes/cpt/template.php
Normal file
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
// Register 'template' post type
|
||||
add_action( 'init', 'headless_template_register_post_type' );
|
||||
function headless_template_register_post_type() {
|
||||
register_post_type(
|
||||
'template',
|
||||
array(
|
||||
'labels' => 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( ' <a target="_blank" href="%1$s">%2$s</a>', esc_url( get_preview_post_link( $post ) ), "Prévisualiser le modèle" );
|
||||
$scheduled_post_link_html = sprintf( ' <a target="_blank" href="%1$s">%2$s</a>', 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( ' <a href="%1$s">%2$s</a>', 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.", '<strong>' . $scheduled_date . '</strong>' ) . $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;
|
||||
}
|
||||
Reference in New Issue
Block a user