SHOW:
|
|
- or go back to the newest paste.
1 | <?php | |
2 | ||
3 | /* | |
4 | - | * Plugin Name: Rewrite "Hersteller" & "Dienstleistungen" permalinks |
4 | + | * Plugin Name: Hersteller/Dienstleistungen permalinks |
5 | * Plugin URI: http://maciejbis.net | |
6 | * Description: A plugin that adjusts the functionality of this website | |
7 | * Version: 1.0 | |
8 | * Author: Maciej Bis | |
9 | * Author URI: http://www.maciejbis.net | |
10 | * License: GPL2 | |
11 | */ | |
12 | ||
13 | /** | |
14 | - | * Detect ad permalinks |
14 | + | * Detect CPT permalinks |
15 | */ | |
16 | function bis_detect_cpt_permalinks( $query ) { | |
17 | - | global $wpdb, $pm_query, $wp, $wp_rewrite; |
17 | + | global $wpdb, $pm_query, $wp, $wp_rewrite, $orte_term; |
18 | ||
19 | // 1. Extract the slugs | |
20 | - | preg_match( '/datenrettung-([^\/]+)\/(([^\/]*)(-[^-\/]+))(?:\/|$)/Ui', $wp->request, $parts ); |
20 | + | preg_match( '/datenrettung-([^\/]+)\/(([^\/]*)(-[^-\/]+)?)(?:\/|$)/Ui', $wp->request, $parts ); |
21 | ||
22 | if ( ! empty( $parts[2] ) ) { | |
23 | $term_slug = basename( $parts[1] ); | |
24 | $post_slug = basename( $parts[2] ); | |
25 | $post_slug_alt = basename( $parts[3] ); | |
26 | ||
27 | - | $sql_query = sprintf( 'SELECT ID FROM %1$s WHERE 1=1 AND |
27 | + | |
28 | - | ( |
28 | + | $sql_query = sprintf( 'SELECT ID FROM %1$s WHERE 1=1 AND ( |
29 | - | (post_type = "dienstleistung" AND (post_name = "%2$s" OR post_name LIKE "%2$s-%%")) OR |
29 | + | (post_type = "dienstleistung" AND (post_name = "%2$s" OR post_name LIKE "%2$s-%%")) OR |
30 | - | (post_type = "hersteller" AND (post_name = "%3$s" OR post_name LIKE "%3$s-%%")) |
30 | + | (post_type = "hersteller" AND (post_name = "%3$s" OR post_name LIKE "%3$s-%%" OR post_name = "%2$s" OR post_name LIKE "%2$s-%%")) |
31 | - | ) |
31 | + | )', $wpdb->posts, esc_sql( $post_slug ), esc_sql( $post_slug_alt ) ); |
32 | - | ', $wpdb->posts, esc_sql( $post_slug ), esc_sql( $post_slug_alt ) ); |
32 | + | |
33 | ||
34 | // Example (can be removed later) | |
35 | - | // 2B. Get all posts that are assigned to a "ort" term extracted from URL |
35 | + | if ( $post_slug == 'permalink-manager' ) { |
36 | - | $term_slug = basename( $parts[1] ); |
36 | + | $post_id = (int) reset( $url_posts ); |
37 | $post = get_post( $post_id ); | |
38 | - | $sql_query = sprintf( 'SELECT object_id FROM %s AS tr LEFT JOIN %s AS t ON tr.term_taxonomy_id = t.term_id WHERE t.slug = "%s"', $wpdb->term_relationships, $wpdb->terms, esc_sql( $term_slug ) ); |
38 | + | |
39 | $orte_term = get_term_by( 'slug', $term_slug, 'orte' ); | |
40 | - | $ort_posts = $wpdb->get_col( $sql_query ); |
40 | + | |
41 | // 2B. Get all posts that are assigned to a "ort" term extracted from URL | |
42 | - | // 2C. Check what posts are in both arrays (there should be only one post) |
42 | + | $sql_query = sprintf( 'SELECT object_id FROM %s AS tr LEFT JOIN %s AS t ON tr.term_taxonomy_id = t.term_id WHERE t.slug = "%s"', $wpdb->term_relationships, $wpdb->terms, esc_sql( $term_slug ) ); |
43 | - | if ( ! empty( $url_posts ) && ! empty( $ort_posts ) ) { |
43 | + | $ort_posts = $wpdb->get_col( $sql_query ); |
44 | - | $found_posts = array_intersect( $url_posts, $ort_posts ); |
44 | + | |
45 | // 2C. Check what posts are in both arrays (there should be only one post) | |
46 | - | if ( ! empty( $found_posts ) ) { |
46 | + | if ( ! empty( $url_posts ) && ! empty( $ort_posts ) ) { |
47 | - | $post_id = (int) reset( $found_posts ); |
47 | + | $found_posts = array_intersect( $url_posts, $ort_posts ); |
48 | - | $post = get_post( $post_id ); |
48 | + | |
49 | if ( ! empty( $found_posts ) ) { | |
50 | $post_id = (int) reset( $found_posts ); | |
51 | $post = get_post( $post_id ); | |
52 | - | if ( ! empty( $post->post_name ) ) { |
52 | + | } |
53 | - | $new_query = array( |
53 | + | } |
54 | - | 'post_type' => $post->post_type, |
54 | + | |
55 | - | $post->post_type => $post->post_name, |
55 | + | } // If no post was found, check if the URL is used by a post without "orte" term |
56 | - | 'name' => $post->post_name, |
56 | + | else if ( ! empty( $query['name'] ) ) { |
57 | - | 'do_not_redirect' => 1, |
57 | + | |
58 | - | ); |
58 | + | $sql_query = sprintf( 'SELECT ID, post_title FROM %1$s p WHERE post_type IN ( "dienstleistung", "hersteller" ) AND (post_name = "%2$s" OR post_name LIKE "%2$s-%%") AND post_status = "publish" AND ID NOT IN (SELECT object_id FROM %3$s tr INNER JOIN %4$s tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = "orte")', $wpdb->posts, basename( $query['name'] ), $wpdb->term_relationships, $wpdb->term_taxonomy ); |
59 | $post_id = $wpdb->get_var( $sql_query ); | |
60 | ||
61 | - | // 3. Debug the query parameters |
61 | + | if ( ! empty( $post_id ) ) { |
62 | - | if ( isset( $_GET['debug_bis_query'] ) ) { |
62 | + | $post = get_post( $post_id ); |
63 | - | printf( '<pre>%s</pre> <pre>%s</pre> <pre>%s</pre>', print_r( $parts, true ), print_r( $query, true ), print_r( $new_query, true ) ); |
63 | + | |
64 | - | die(); |
64 | + | |
65 | ||
66 | // 3. Set the query parameters | |
67 | - | // 4. Overwrite the query object & Disable canonical redirect |
67 | + | if ( ! empty( $post->post_name ) ) { |
68 | - | if ( ! empty( $new_query ) ) { |
68 | + | $new_query = array( |
69 | - | remove_action( 'template_redirect', 'wp_old_slug_redirect' ); |
69 | + | 'post_type' => $post->post_type, |
70 | - | remove_action( 'template_redirect', 'redirect_canonical' ); |
70 | + | $post->post_type => $post->post_name, |
71 | - | add_filter( 'wpml_is_redirected', '__return_false', 99, 2 ); |
71 | + | 'name' => $post->post_name, |
72 | - | add_filter( 'pll_check_canonical_url', '__return_false', 99, 2 ); |
72 | + | 'do_not_redirect' => 1, |
73 | ); | |
74 | - | $query = $new_query; |
74 | + | |
75 | ||
76 | // 4. Debug the query parameters | |
77 | if ( isset( $_GET['debug_bis_query'] ) ) { | |
78 | $new_query = ( ! empty( $new_query ) ) ? $new_query : $query; | |
79 | var_dump( $parts ); | |
80 | ||
81 | echo ( ! empty( $parts ) ) ? sprintf( '<h2>URL Parts:</h2><pre>%s</pre>', print_r( $parts, true ) ) : ''; | |
82 | echo ( ! empty( $sql_query ) ) ? sprintf( '<h2>SQL query:</h2><pre>%s</pre>', print_r( $sql_query, true ) ) : ''; | |
83 | echo ( ! empty( $query ) ) ? sprintf( '<h2>Old query value:</h2><pre>%s</pre>', print_r( $query, true ) ) : ''; | |
84 | echo ( ! empty( $new_query ) ) ? sprintf( '<h2>New query value Parts:</h2><pre>%s</pre>', print_r( $new_query, true ) ) : ''; | |
85 | echo ( ! empty( $term_slug ) ) ? sprintf( '<h2>Detected "orte" slug:</h2><pre>%s</pre>', print_r( $term_slug, true ) ) : ''; | |
86 | - | function pm_filter_cpt_permalinks( $permalink, $post ) { |
86 | + | |
87 | die(); | |
88 | } | |
89 | ||
90 | // 5. Overwrite the query object & disable canonical redirect | |
91 | - | if ( in_array( $post->post_type, array( 'hersteller', 'dienstleistung' ) ) ) { |
91 | + | if ( ! empty( $new_query ) ) { |
92 | - | // Get the slug of assigned 'orte' term |
92 | + | remove_action( 'template_redirect', 'wp_old_slug_redirect' ); |
93 | remove_action( 'template_redirect', 'redirect_canonical' ); | |
94 | - | $o_lowest_term = ( ! is_wp_error( $o_terms ) && ! empty( $o_terms ) && is_object( $o_terms[0] ) ) ? pm_get_lowest_element( $o_terms[0], $o_terms ) : ""; |
94 | + | add_filter( 'wpml_is_redirected', '__return_false', 99, 2 ); |
95 | add_filter( 'pll_check_canonical_url', '__return_false', 99, 2 ); | |
96 | ||
97 | - | // A. Hersteller (datenrettung-%orte_flat%/%hersteller%-%herstellerkategorie%) |
97 | + | $query = $new_query; |
98 | } | |
99 | ||
100 | - | // Get the slug of assigned 'herstellerkategorie' term |
100 | + | |
101 | } | |
102 | - | $h_lowest_term = ( ! is_wp_error( $h_terms ) && ! empty( $h_terms ) && is_object( $h_terms[0] ) ) ? pm_get_lowest_element( $h_terms[0], $h_terms ) : ""; |
102 | + | |
103 | add_filter( 'request', 'bis_detect_cpt_permalinks', 9999 ); | |
104 | ||
105 | - | $new_permalink = sprintf( '%s/datenrettung-%s/%s-%s', trim( get_option( 'home' ), '/' ), $o_slug, sanitize_title( $post->post_title ), $h_slug ); |
105 | + | |
106 | * Rewrite permalinks | |
107 | */ | |
108 | - | // B. Datenrettung (datenrettung-%orte_flat%/%dienstleistung%) |
108 | + | function bis_filter_cpt_permalinks( $permalink, $post, $leavename, $sample ) { |
109 | if ( empty( $post->post_type ) || $post->post_status !== 'publish' ) { | |
110 | - | $new_permalink = sprintf( '%s/datenrettung-%s/%s', trim( get_option( 'home' ), '/' ), $o_slug, sanitize_title( $post->post_title ) ); |
110 | + | |
111 | } | |
112 | ||
113 | if ( in_array( $post->post_type, array( | |
114 | 'hersteller', | |
115 | 'dienstleistung' | |
116 | ) ) ) { | |
117 | // Get the slug of assigned 'orte' term | |
118 | $o_terms = wp_get_object_terms( $post->ID, 'orte' ); | |
119 | - | add_filter( 'post_type_link', 'pm_filter_cpt_permalinks', 1000, 2 ); |
119 | + | $o_lowest_term = ( ! is_wp_error( $o_terms ) && ! empty( $o_terms ) && is_object( $o_terms[0] ) ) ? bis_get_lowest_element( $o_terms[0], $o_terms ) : ""; |
120 | $o_slug = ( ! empty( $o_lowest_term->slug ) ) ? $o_lowest_term->slug : ''; | |
121 | ||
122 | // A. Hersteller | |
123 | if ( $post->post_type == 'hersteller' ) { | |
124 | - | function pm_get_lowest_element( $first_element, $elements ) { |
124 | + | |
125 | // Get the slug of assigned 'herstellerkategorie' term | |
126 | $h_terms = wp_get_object_terms( $post->ID, 'herstellerkategorie' ); | |
127 | $h_lowest_term = ( ! is_wp_error( $h_terms ) && ! empty( $h_terms ) && is_object( $h_terms[0] ) ) ? bis_get_lowest_element( $h_terms[0], $h_terms ) : ""; | |
128 | $h_slug = ( ! empty( $h_lowest_term->slug ) ) ? $h_lowest_term->slug : ''; | |
129 | ||
130 | // If some specific 'herstellerkategorie' terms are assigned, the term slug should not be appended to the end of URL | |
131 | // Permalink format: datenrettung-%orte_flat%/%hersteller% | |
132 | if ( in_array( $h_slug, array( 'raid' ) ) && ! empty ( $o_slug ) ) { | |
133 | $new_permalink = sprintf( '%s/datenrettung-%s', trim( get_option( 'home' ), '/' ), $o_slug ); | |
134 | $new_slug = sanitize_title( $post->post_title ); | |
135 | } // Permalink format: datenrettung-%orte_flat%/%hersteller%-%herstellerkategorie% | |
136 | else if ( ! empty( $o_slug ) && ! empty ( $h_slug ) ) { | |
137 | $new_permalink = sprintf( '%s/datenrettung-%s', trim( get_option( 'home' ), '/' ), $o_slug ); | |
138 | $new_slug = sprintf( '%s-%s', sanitize_title( $post->post_title ), $h_slug ); | |
139 | } // Permalink format: %hersteller%-%herstellerkategorie% | |
140 | - | $children = wp_filter_object_list( $elements, array( $parent_key => $first_element_id ) ); |
140 | + | else { |
141 | $new_permalink = trim( get_option( 'home' ), '/' ); | |
142 | $new_slug = sanitize_title( $post->post_title ); | |
143 | } | |
144 | - | $first_element = pm_get_lowest_element( $child_term, $elements ); |
144 | + | |
145 | ||
146 | // B. Dienstleistung | |
147 | if ( $post->post_type == 'dienstleistung' ) { | |
148 | // Permalink format: datenrettung-%orte_flat%/%dienstleistung% | |
149 | - | } |
149 | + | if ( ! empty( $o_slug ) ) { |
150 | $new_permalink = sprintf( '%s/datenrettung-%s', trim( get_option( 'home' ), '/' ), $o_slug ); | |
151 | $new_slug = sanitize_title( $post->post_title ); | |
152 | } // Permalink format: %dienstleistung% | |
153 | else { | |
154 | $new_permalink = trim( get_option( 'home' ), '/' ); | |
155 | $new_slug = sanitize_title( $post->post_title ); | |
156 | } | |
157 | } | |
158 | ||
159 | if ( ! empty( $sample ) ) { | |
160 | $new_permalink .= "/%{$post->post_type}%"; | |
161 | } else if ( empty( $leavename ) ) { | |
162 | $new_permalink .= "/{$new_slug}"; | |
163 | } | |
164 | ||
165 | $permalink = user_trailingslashit( $new_permalink ); | |
166 | } | |
167 | ||
168 | return $permalink; | |
169 | } | |
170 | ||
171 | add_filter( 'post_type_link', 'bis_filter_cpt_permalinks', 1000, 4 ); | |
172 | ||
173 | /** | |
174 | * Register [orte] shortcode | |
175 | */ | |
176 | function bis_orte_shortcode($atts, $content) { | |
177 | global $orte_term; | |
178 | ||
179 | $atts = shortcode_atts( array( | |
180 | 'before' => 'in', | |
181 | 'after' => 'in', | |
182 | 'no-orte' => '' | |
183 | ), $atts, 'orte' ); | |
184 | ||
185 | if ( !empty( $orte_term->slug ) ) { | |
186 | $orte = $orte_term->name; | |
187 | } | |
188 | ||
189 | // If 'orte' was found, use it | |
190 | if(!empty($orte)) { | |
191 | $html = (!empty($atts['before'])) ? $atts['before'] : ''; | |
192 | $html .= $orte; | |
193 | $html .= (!empty($atts['after'])) ? $atts['after'] : ''; | |
194 | } | |
195 | // If no 'orte' was found, use alternative text (if set in shortcode) | |
196 | else if(!empty($atts['no-orte'])) { | |
197 | $html = $atts['no-orte']; | |
198 | } else { | |
199 | $html = ''; | |
200 | } | |
201 | ||
202 | return $html; | |
203 | } | |
204 | add_shortcode( 'orte', 'bis_orte_shortcode' ); | |
205 | ||
206 | /** | |
207 | * Allow shortcodes in the titles | |
208 | */ | |
209 | add_filter( 'the_title', 'do_shortcode' ); | |
210 | ||
211 | /** | |
212 | * Get the lowest-level term | |
213 | */ | |
214 | function bis_get_lowest_element( $first_element, $elements ) { | |
215 | if ( ! empty( $elements ) && ! empty( $first_element ) ) { | |
216 | // Get the ID of first element | |
217 | if ( ! empty( $first_element->term_id ) ) { | |
218 | $first_element_id = $first_element->term_id; | |
219 | $parent_key = 'parent'; | |
220 | } else if ( ! empty( $first_element->ID ) ) { | |
221 | $first_element_id = $first_element->ID; | |
222 | $parent_key = 'post_parent'; | |
223 | } else if ( is_numeric( $first_element ) ) { | |
224 | $first_element_id = $first_element; | |
225 | $parent_key = 'post_parent'; | |
226 | } else { | |
227 | return false; | |
228 | } | |
229 | ||
230 | $children = wp_filter_object_list( $elements, array( | |
231 | $parent_key => $first_element_id | |
232 | ) ); | |
233 | if ( ! empty( $children ) ) { | |
234 | // Get the first term | |
235 | $child_term = reset( $children ); | |
236 | $first_element = bis_get_lowest_element( $child_term, $elements ); | |
237 | } | |
238 | } | |
239 | ||
240 | return $first_element; | |
241 | } | |
242 | ||
243 |