SHOW:
|
|
- or go back to the newest paste.
| 1 | <?php | |
| 2 | - | * Detect product permalinks |
| 2 | + | |
| 3 | /** | |
| 4 | - | function pm_detect_post_slugs($query) {
|
| 4 | + | * Use only for specific CPT posts |
| 5 | - | global $wpdb, $pm_query; |
| 5 | + | |
| 6 | define('PM_CPT_NAME', 'courses');
| |
| 7 | - | if(!empty($pm_query['uri'])) {
|
| 7 | + | |
| 8 | - | $post_name = basename($pm_query['uri']); |
| 8 | + | |
| 9 | * The function that detects the CPT posts permalinks | |
| 10 | - | $sql_query = $wpdb->prepare( |
| 10 | + | |
| 11 | - | "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = 'product'", |
| 11 | + | function pm_detect_cpt_slugs($query) {
|
| 12 | - | array($post_name) |
| 12 | + | global $wpdb, $pm_query, $wp, $wp_rewrite; |
| 13 | - | ); |
| 13 | + | |
| 14 | - | $uri = $wpdb->get_var($sql_query); |
| 14 | + | // Do not run when Elementor is opened |
| 15 | if((!empty($_REQUEST['action']) && strpos($_REQUEST['action'], 'elementor') !== false) || isset($_REQUEST['elementor-preview'])) {
| |
| 16 | - | if(!empty($uri)) {
|
| 16 | + | return $query; |
| 17 | - | $page = (!empty($query['page'])) ? $query['page'] : 1; |
| 17 | + | |
| 18 | ||
| 19 | - | 'product' => $uri, |
| 19 | + | // 1. Get the slug |
| 20 | - | 'post_type' => 'product', |
| 20 | + | preg_match("/([^\/]+)(?:\/{$wp_rewrite->pagination_base}\/([\d]+))?$/", $wp->request, $parts);
|
| 21 | - | 'name' => $uri, |
| 21 | + | |
| 22 | - | 'page' => $page, |
| 22 | + | if(!empty($parts[1])) {
|
| 23 | $post_name = basename($parts[1]); | |
| 24 | $post_type = PM_CPT_NAME; | |
| 25 | ||
| 26 | - | // Disable canonical redirect |
| 26 | + | // 2. Check if the slug is assigned to any post item |
| 27 | $sql_query = "SELECT ID FROM $wpdb->posts WHERE 1=1 AND post_name = %s AND post_type = %s"; | |
| 28 | $post_id = $wpdb->get_var($wpdb->prepare($sql_query, array($post_name, $post_type))); | |
| 29 | ||
| 30 | // 3. Filter the query if post was found | |
| 31 | if(!empty($post_id)) {
| |
| 32 | - | return $new_query; |
| 32 | + | $post = get_post($post_id); |
| 33 | ||
| 34 | if(empty($post->post_type)) { return $query; }
| |
| 35 | ||
| 36 | $post_type_object = get_post_type_object($post->post_type); | |
| 37 | $final_uri = (!empty($post->post_name)) ? $post->post_name : false; | |
| 38 | - | add_filter('request', 'pm_detect_post_slugs');
|
| 38 | + | |
| 39 | // Fix for hierarchical CPT & pages | |
| 40 | if(!(empty($post->ancestors)) && !empty($post_type_object->hierarchical)) {
| |
| 41 | - | * Filter product permalinks |
| 41 | + | foreach($post->ancestors as $parent) {
|
| 42 | - | */ |
| 42 | + | $parent = get_post($parent); |
| 43 | - | function bis_filter_product_permalinks($url, $element) {
|
| 43 | + | |
| 44 | - | if(!empty($element->post_type) && ($element->post_type == 'product')) {
|
| 44 | + | if($parent && $parent->post_name) {
|
| 45 | - | $home_base = trim(get_option('home'), '/');
|
| 45 | + | $final_uri = $parent->post_name . '/' . $final_uri; |
| 46 | - | |
| 46 | + | } |
| 47 | - | // $url = preg_replace('/(http(?:s)?:\/\/(?:www\.)?[^\/]+\/)([^\/]+)\/([^\/]+)/', '$1$3', $url);
|
| 47 | + | } |
| 48 | - | $url = "{$home_base}/{$element->post_name}";
|
| 48 | + | } |
| 49 | ||
| 50 | $new_query = array( | |
| 51 | - | return user_trailingslashit($url); |
| 51 | + | 'post_type' => $post->post_type, |
| 52 | $post->post_type => $final_uri, | |
| 53 | - | add_filter('post_type_link', 'bis_filter_product_permalinks', 999, 2); |
| 53 | + | 'name' => $final_uri, |
| 54 | 'do_not_redirect' => 1, | |
| 55 | ); | |
| 56 | ||
| 57 | // 4. Disable canonical redirect | |
| 58 | remove_action('template_redirect', 'wp_old_slug_redirect');
| |
| 59 | remove_action('template_redirect', 'redirect_canonical');
| |
| 60 | add_filter('wpml_is_redirected', '__return_false', 99, 2);
| |
| 61 | add_filter('pll_check_canonical_url', '__return_false', 99, 2);
| |
| 62 | ||
| 63 | $query = $new_query; | |
| 64 | } | |
| 65 | } | |
| 66 | ||
| 67 | if(isset($_GET['debug_query'])) {
| |
| 68 | echo sprintf('<pre>Old query: %s</pre>', print_r($query, true));
| |
| 69 | echo (!empty($new_query)) ? sprintf('<pre>New query: %s</pre>', print_r($new_query, true)) : '';
| |
| 70 | echo (!empty($parts)) ? sprintf('<pre>Parts: %s</pre>', print_r($parts, true)) : '';
| |
| 71 | die(); | |
| 72 | } | |
| 73 | ||
| 74 | return $query; | |
| 75 | } | |
| 76 | add_filter('request', 'pm_detect_cpt_slugs', 9999);
| |
| 77 | ||
| 78 | function bis_filter_cpt_permalinks($url, $element) {
| |
| 79 | if(!empty($element->post_type) && ($element->post_type == PM_CPT_NAME)) {
| |
| 80 | $full_uri = get_page_uri($element->ID); | |
| 81 | $url = trim(get_option('home'), '/') . "/{$full_uri}";
| |
| 82 | } | |
| 83 | ||
| 84 | return $url; | |
| 85 | } | |
| 86 | add_filter('post_type_link', 'bis_filter_cpt_permalinks', 999, 2);
| |
| 87 | ||
| 88 | function pm_redirect_native_cpt_permalinks() {
| |
| 89 | global $wp; | |
| 90 | ||
| 91 | if(!empty($wp->request) && is_singular(PM_CPT_NAME)) {
| |
| 92 | $cpt_data = get_post_type_object(PM_CPT_NAME); | |
| 93 | $cpt_slug = preg_quote($cpt_data->rewrite['slug'], '/'); | |
| 94 | ||
| 95 | if(!empty($cpt_slug) && preg_match("/^({$cpt_slug})/", $wp->request)) {
| |
| 96 | $url = get_permalink(); | |
| 97 | wp_safe_redirect($url, 301); | |
| 98 | exit(); | |
| 99 | } | |
| 100 | } | |
| 101 | } | |
| 102 | add_action('template_redirect', 'pm_redirect_native_cpt_permalinks', 1); |