Last active
May 13, 2018 13:32
-
-
Save hwkdev/3f3fd6fc767cb382763e030b47810199 to your computer and use it in GitHub Desktop.
Article: https://hwk.fr/blog/creer-des-sous-pages-dynamiques-de-post-type-avec-des-permaliens-personnalises
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| // Post Type Subpages: Settings | |
| function hwk_ptsp_settings(){ | |
| return apply_filters('hwk/post_types/subpages', array()); | |
| } | |
| // Post Type Subpages: Récupération des Post Types | |
| function hwk_ptsp_get_post_types(){ | |
| if(!$settings = hwk_ptsp_settings()) | |
| return false; | |
| return $settings; | |
| } | |
| // Post Type Subpages: Récupération d'un Post Type en paroculier | |
| function hwk_ptsp_get_post_type($target_post_type){ | |
| if(!$post_types = hwk_ptsp_get_post_types()) | |
| return false; | |
| foreach($post_types as $post_type){ | |
| if($post_type['post_type'] != $target_post_type) | |
| continue; | |
| return $post_type; | |
| } | |
| return false; | |
| } | |
| // Post Type Subpages: Récupération du paramètre 'Rewrite' d'un Post Type particulier | |
| function hwk_ptsp_get_post_type_rewrite($post_type){ | |
| if(!($post_type_object = get_post_type_object($post_type)) || !($post_type_object_rewrite = $post_type_object->rewrite)) | |
| return false; | |
| return $post_type_object_rewrite['slug']; | |
| } | |
| // Post Type Subpages: Récupération de la sous-page 'primary' si elle existe dans un Post Type particulier | |
| function hwk_ptsp_post_type_has_primary($target_post_type){ | |
| if(!$post_types = hwk_ptsp_get_post_types()) | |
| return; | |
| foreach($post_types as $post_type){ | |
| if($post_type['post_type'] != $target_post_type) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| if($page['primary']) | |
| return $page; | |
| } | |
| } | |
| return false; | |
| } | |
| // Post Type Subpages: Récupération d'une sous-page en particulier, dans un Post Type en particulier | |
| function hwk_ptsp_get_page($page_name, $target_post_type){ | |
| if( !($post_type = hwk_ptsp_get_post_type($target_post_type)) || !isset($post_type['pages']) || empty($post_type['pages']) ) | |
| return false; | |
| foreach($post_type['pages'] as $page){ | |
| if($page['name'] != $page_name) | |
| continue; | |
| return $page; | |
| } | |
| return false; | |
| } | |
| // Post Type Subpages: Récupération du paramètre 'rewrite' d'une page en particulier. Permalien dynamique? | |
| function hwk_ptsp_page_has_rewrite($page){ | |
| if( isset($page['rewrite']) && (isset($page['rewrite']['prepend']) || isset($page['rewrite']['append'])) ) | |
| return $page['rewrite']; | |
| return false; | |
| } | |
| // Post Type Subpages: Récupération de la règle Regex pour le permalien d'une page en particulier | |
| function hwk_ptsp_get_page_rewrite_output($page, $slug){ | |
| if(!hwk_ptsp_page_has_rewrite($page)) | |
| return $page['name']; | |
| if(isset($page['rewrite']['prepend']) && !empty($page['rewrite']['prepend'])) | |
| $slug = $page['rewrite']['prepend'] . '–' . $slug; | |
| if(isset($page['rewrite']['append']) && !empty($page['rewrite']['append'])) | |
| $slug .= '–' . $page['rewrite']['append']; | |
| return $slug; | |
| } | |
| // Post Type Subpages: Création des Règles de Rewrite Rules | |
| add_action('generate_rewrite_rules', 'hwk_ptsp_rewrite_rules'); | |
| function hwk_ptsp_rewrite_rules($wp_rewrite){ | |
| if(!$post_types = hwk_ptsp_get_post_types()) | |
| return; | |
| $wp_rules = $wp_rewrite->rules; | |
| $new_rules = array(); | |
| foreach($post_types as $post_type){ | |
| if(!$post_type_rewrite = hwk_ptsp_get_post_type_rewrite($post_type['post_type'])) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| $tag = '([^/]+)'; | |
| $prepend = $append = false; | |
| if(hwk_ptsp_page_has_rewrite($page)){ | |
| if(isset($page['rewrite']['prepend']) && !empty($page['rewrite']['prepend'])) | |
| $tag = $page['rewrite']['prepend'] . '–' . $tag; | |
| if(isset($page['rewrite']['append']) && !empty($page['rewrite']['append'])) | |
| $tag .= '–' . $page['rewrite']['append']; | |
| $match = '&ptsp=$matches[2]'; | |
| $paged = '&paged=$matches[3]'; | |
| } | |
| else{ | |
| $tag = $page['name']; | |
| $match = '&ptsp=' . $page['name']; | |
| $paged = '&paged=$matches[2]'; | |
| } | |
| if($page['pagination']) | |
| $new_rules[$post_type_rewrite . '/([^/]+)/' . $tag . '/page/([0-9]{1,})/?$'] = 'index.php?' . $post_type['post_type'] . '=$matches[1]' . $match . $paged; | |
| $new_rules[$post_type_rewrite . '/([^/]+)/' . $tag . '/?$'] = 'index.php?' . $post_type['post_type'] . '=$matches[1]' . $match; | |
| } | |
| } | |
| $wp_rewrite->rules = array_merge($new_rules, $wp_rules); | |
| } | |
| // Post Type Subpages: Ajout des Query Vars | |
| add_filter('query_vars', 'hwk_ptsp_query_vars'); | |
| function hwk_ptsp_query_vars($vars){ | |
| if(!$post_types = hwk_ptsp_get_post_types()) | |
| return $vars; | |
| $vars[] = 'ptsp'; | |
| return $vars; | |
| } | |
| // Post Type Subpages: Création des redirections | |
| add_action('template_redirect', 'hwk_ptsp_redirect'); | |
| function hwk_ptsp_redirect(){ | |
| if( !($post_id = get_the_ID()) || !($post_types = hwk_ptsp_get_post_types()) || !get_query_var('ptsp') ) | |
| return; | |
| foreach($post_types as $post_type){ | |
| if(!is_singular($post_type['post_type'])) | |
| continue; | |
| $query_var = false; | |
| foreach($post_type['pages'] as $page){ | |
| if(get_query_var('ptsp') != $page['name']) | |
| continue; | |
| // Si pas de Page Rewrite et Query Var différent de la page OU Page Rewrite activé et Page Meta disponible mais ne correspond pas au Query Var: Redirection | |
| $query_var = true; | |
| $has_rewrite = hwk_ptsp_page_has_rewrite($page); | |
| if( (!$has_rewrite && get_query_var('ptsp') != $page['name']) || ( $has_rewrite && ($slug = get_post_meta($post_id, $post_type['meta_prefix'] . $page['name'], true)) && get_query_var('ptsp') != $slug ) ) | |
| return wp_redirect(hwk_ptsp_get_sub_permalink($post_id, $page['name']), 301); | |
| } | |
| // Aucune Query Var et le Post Type a une Page Primaire | |
| if(!$query_var && hwk_ptsp_post_type_has_primary($post_type['post_type'])) | |
| return wp_redirect(get_permalink($post_id), 301); | |
| } | |
| } | |
| // Post Type Subpages: Templates | |
| add_filter('template_include', 'hwk_ptsp_template', 9999); | |
| function hwk_ptsp_template($template){ | |
| if( !($post_id = get_the_ID()) || !($post_types = hwk_ptsp_get_post_types()) || !get_query_var('ptsp') ) | |
| return $template; | |
| foreach($post_types as $post_type){ | |
| if(!is_singular($post_type['post_type'])) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| if(get_query_var('ptsp') != $page['name'] || !isset($page['template']) || empty($page['template'])) | |
| continue; | |
| // Template de la Page par défaut | |
| if($new_template = locate_template(array($page['template']))) | |
| return $new_template; | |
| } | |
| } | |
| return $template; | |
| } | |
| // Post Type Subpages: Saubegarde d'un post | |
| add_action('save_post', 'hwk_ptsp_save_post', 10, 2); | |
| function hwk_ptsp_save_post($post_id, $post){ | |
| if(!$post_type = hwk_ptsp_get_post_type($post->post_type)) | |
| return; | |
| // Aucun Meta Parent: Création du meta par défaut | |
| if(!get_post_meta($post_id, $post_type['meta_prefix'] . 'parent', true)) | |
| update_post_meta($post_id, $post_type['meta_prefix'] . 'parent', get_post_field('post_name', $post_id)); | |
| // Aucun Meta Page: Création des metas par défaut | |
| foreach($post_type['pages'] as $page){ | |
| if( !get_post_meta($post_id, $post_type['meta_prefix'] . $page['name'], true) && hwk_ptsp_page_has_rewrite($page) ) | |
| update_post_meta($post_id, $post_type['meta_prefix'] . $page['name'], get_post_field('post_name', $post_id)); | |
| } | |
| // Meta Parent: Sanitize & Update du post->name | |
| if( ($new_slug = get_post_meta($post_id, $post_type['meta_prefix'] . 'parent', true)) && $new_slug != $post->post_name){ | |
| $new_slug = sanitize_title($new_slug); | |
| wp_update_post(array( | |
| 'ID' => $post_id, | |
| 'post_name' => $new_slug | |
| )); | |
| } | |
| } | |
| // Post Type Subpages: Mise à jour d'un post_meta | |
| add_action('added_post_meta', 'hwk_ptsp_update_meta', 10, 4); | |
| add_action('updated_post_meta', 'hwk_ptsp_update_meta', 10, 4); | |
| function hwk_ptsp_update_meta($meta_id, $post_id, $meta_key, $meta_value){ | |
| if(!$post_type = hwk_ptsp_get_post_type(get_post_type($post_id))) | |
| return; | |
| // Meta Parent: Sanitize & Update du post->name | |
| if($meta_key == $post_type['meta_prefix'] . 'parent'){ | |
| $new_slug = sanitize_title($meta_value); | |
| update_post_meta($post_id, $post_type['meta_prefix'] . 'parent', $new_slug); | |
| return wp_update_post(array( | |
| 'ID' => $post_id, | |
| 'post_name' => $new_slug | |
| )); | |
| } | |
| foreach($post_type['pages'] as $page){ | |
| if($meta_key != $post_type['meta_prefix'] . $page['name']) | |
| continue; | |
| // Meta Page: Sanitize & Update | |
| return update_post_meta($post_id, $post_type['meta_prefix'] . $page['name'], sanitize_title($meta_value)); | |
| } | |
| } | |
| // Post Type Subpages: Hook get_permalink() | |
| add_filter('post_link', 'hwk_ptsp_get_permalink', 10, 3); | |
| add_filter('post_type_link', 'hwk_ptsp_get_permalink', 10, 3); | |
| function hwk_ptsp_get_permalink($permalink, $post){ | |
| if(!$post_types = hwk_ptsp_get_post_types()) | |
| return $permalink; | |
| foreach($post_types as $post_type){ | |
| // Mauvais Post Type ou le Post Type n'a pas de Page Primaire ou le Post Type n'a pas de Rewrite configuré | |
| if(!isset($post->post_type) || $post->post_type != $post_type['post_type'] || !hwk_ptsp_post_type_has_primary($post_type['post_type']) || !($post_type_rewrite = hwk_ptsp_get_post_type_rewrite($post_type['post_type']))) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| // La Page n'est pas Primaire | |
| if(!$page['primary']) | |
| continue; | |
| // Page Primaire activée – Pas de paramètre Rewrite: Afficher le Page Name de base | |
| if( !hwk_ptsp_page_has_rewrite($page) ) | |
| return home_url(user_trailingslashit($post_type_rewrite . '/' . $post->post_name . '/' . $page['name'])); | |
| // Page Primaire activée – Paramètre Rewrite: Afficher l'URL dynamique | |
| if( ($slug = get_post_meta($post->ID, $post_type['meta_prefix'] . $page['name'], true)) && !empty($slug) ) | |
| return home_url(user_trailingslashit($post_type_rewrite . '/' . $post->post_name . '/' . hwk_ptsp_get_page_rewrite_output($page, $slug) )); | |
| } | |
| } | |
| return $permalink; | |
| } | |
| // Post Type Subpages: Nouvelle fonction pour récupérer le Permalien d'une sous-page | |
| function hwk_ptsp_get_sub_permalink($post_id, $page_name = false){ | |
| if( !$page_name || !($post_types = hwk_ptsp_get_post_types()) ) | |
| return get_permalink($post_id); | |
| foreach($post_types as $post_type){ | |
| // Mauvais Post Type ou le Post Type n'a pas de Rewrite activé | |
| if( get_post_type($post_id) != $post_type['post_type'] || !($post_type_rewrite = hwk_ptsp_get_post_type_rewrite($post_type['post_type'])) ) | |
| continue; | |
| // Si la Page n'existe pas, retourner l'URL du parent | |
| if(!$page = hwk_ptsp_get_page($page_name, $post_type['post_type'])) | |
| return get_permalink($post_id); | |
| // Si la page n'a pas de paramètre Rewrite: Afficher le Page Name de base | |
| if( !hwk_ptsp_page_has_rewrite($page) ) | |
| return home_url(user_trailingslashit($post_type_rewrite . '/' . get_post_field('post_name', $post_id) . '/' . $page['name'])); | |
| // Retourner l'URL dynamique | |
| if( ($slug = get_post_meta($post_id, $post_type['meta_prefix'] . $page_name, true)) && !empty($slug) ) | |
| return home_url(user_trailingslashit( $post_type_rewrite . '/' . get_post_field('post_name', $post_id) . '/' . hwk_ptsp_get_page_rewrite_output($page, $slug) )); | |
| } | |
| return get_permalink($post_id); | |
| } | |
| // Post Type Subpages: native Canonical | |
| add_filter('get_canonical_url', 'hwk_ptsp_canonical', 10, 2); | |
| function hwk_ptsp_canonical($canonical, $post){ | |
| if(!($post_types = hwk_ptsp_get_post_types()) || !get_query_var('ptsp')) | |
| return $canonical; | |
| foreach($post_types as $post_type){ | |
| if(!is_singular($post_type['post_type'])) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| if(get_query_var('ptsp') != $page['name']) | |
| continue; | |
| return hwk_ptsp_get_sub_permalink($post->ID, $page['name']); | |
| } | |
| } | |
| return $canonical; | |
| } | |
| // Post Type Subpages: YOAST Hooks | |
| if(function_exists('wpseo_replace_vars')): | |
| // Post Type Subpages: YOAST Canonical | |
| add_filter('wpseo_canonical', 'hwk_ptsp_yoast_canonical'); | |
| function hwk_ptsp_yoast_canonical($canonical){ | |
| if( !($post_id = get_the_ID()) || !($post_types = hwk_ptsp_get_post_types()) || !get_query_var('ptsp') ) | |
| return $canonical; | |
| foreach($post_types as $post_type){ | |
| if(!is_singular($post_type['post_type'])) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| if(get_query_var('ptsp') != $page['name']) | |
| continue; | |
| return hwk_ptsp_get_sub_permalink($post_id, $page['name']); | |
| } | |
| } | |
| return $canonical; | |
| } | |
| // Post Type Subpages: YOAST Title | |
| add_filter('wpseo_title', 'hwk_ptsp_yoast_title'); | |
| function hwk_ptsp_yoast_title($title){ | |
| if( !($post_id = get_the_ID()) || !($post_types = hwk_ptsp_get_post_types()) || !get_query_var('ptsp') ) | |
| return $title; | |
| foreach($post_types as $post_type){ | |
| if(!is_singular($post_type['post_type'])) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| if(get_query_var('ptsp') != $page['name']) | |
| continue; | |
| // Page Primaire activée: Retourner le titre du meta Yoast | |
| if( $page['primary'] && ($yoast_title = get_post_meta($post_id, '_yoast_wpseo_title', true)) && !empty($yoast_title) ) | |
| return $yoast_title; | |
| // Page Primaire activée: Retourner le titre de l'option Yoast | |
| if($page['primary'] && ($yoast_titles = get_option('wpseo_titles')) && isset($yoast_titles['title-' . $post_type['post_type']]) && !empty($yoast_titles['title-' . $post_type['post_type']]) ) | |
| return apply_filters('the_title', wpseo_replace_vars($yoast_titles['title-' . $post_type['post_type']], get_post($post_id))); | |
| // Retourner le titre du meta | |
| if($meta_title = get_post_meta($post_id, $post_type['meta_prefix'] . $page['name'] . '_meta_title', true) && !empty($meta_title)) | |
| return $meta_title; | |
| // Retourner le titre de l'option Yoast | |
| if( ($yoast_titles = get_option('wpseo_titles')) && isset($yoast_titles['title-' . $post_type['post_type']]) && !empty($yoast_titles['title-' . $post_type['post_type']]) ) | |
| return apply_filters('the_title', wpseo_replace_vars($page['title'] . ' ' . $yoast_titles['title-' . $post_type['post_type']], get_post($post_id))); | |
| // Aucune condition remplis, retourner un titre générique | |
| return $page['title'] . ' ' . get_the_title($post_id) . ' – ' . get_bloginfo('name'); | |
| } | |
| } | |
| return $title; | |
| } | |
| // Post Type Subpages: YOAST Description | |
| add_filter('wpseo_metadesc', 'hwk_ptsp_yoast_description'); | |
| function hwk_ptsp_yoast_description($description){ | |
| if( !($post_id = get_the_ID()) || !($post_types = hwk_ptsp_get_post_types()) || !get_query_var('ptsp') ) | |
| return $description; | |
| foreach($post_types as $post_type){ | |
| if(!is_singular($post_type['post_type'])) | |
| continue; | |
| foreach($post_type['pages'] as $page){ | |
| if(get_query_var('ptsp') != $page['name']) | |
| continue; | |
| // Page Primaire activée: Retourner la description du meta Yoast | |
| if( $page['primary'] && ($yoast_desc = get_post_meta($post_id, '_yoast_wpseo_desc', true)) && !empty($yoast_desc) ) | |
| return $yoast_desc; | |
| // Page Primaire activée: Retourner la description de l'option Yoast | |
| if($page['primary'] && ($yoast_titles = get_option('wpseo_titles')) && isset($yoast_titles['metadesc-' . $post_type['post_type']]) && !empty($yoast_titles['metadesc-' . $post_type['post_type']]) ) | |
| return apply_filters('the_title', wpseo_replace_vars($yoast_titles['metadesc-' . $post_type['post_type']], get_post($post_id))); | |
| // Retourner la description du meta | |
| if($meta_desc = get_post_meta($post_id, $post_type['meta_prefix'] . $page['name'] . '_meta_description', true) && !empty($meta_desc)) | |
| return $meta_desc; | |
| // Retourner la description de l'option Yoast | |
| if( ($yoast_titles = get_option('wpseo_titles')) && isset($yoast_titles['metadesc-' . $post_type['post_type']]) && !empty($yoast_titles['metadesc-' . $post_type['post_type']]) ) | |
| return apply_filters('the_title', wpseo_replace_vars($page['title'] . ' ' . $yoast_titles['metadesc-' . $post_type['post_type']], get_post($post_id))); | |
| // Aucune condition remplis, retourner une description générique | |
| return $page['title'] . ' ' . get_the_title($post_id) . ' – ' . get_bloginfo('name'); | |
| } | |
| } | |
| return $description; | |
| } | |
| endif; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment