admin
10 years ago
plugins
11 years ago
widget
10 years ago
fixes-archive.php
11 years ago
fixes-dates.php
11 years ago
fixes-get_archives.php
11 years ago
fixes-get_calendar.php
11 years ago
fixes-misc.php
11 years ago
fixes-permalinks.php
11 years ago
general.php
10 years ago
install.php
11 years ago
parsidate.php
11 years ago
settings.php
10 years ago
fixes-permalinks.php
321 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Fixes and converts permalinks date to Jalali |
| 4 | * |
| 5 | * @author Mobin Ghasempoor |
| 6 | * @package WP-Parsidate |
| 7 | * @subpackage Fixes/Permalinks |
| 8 | */ |
| 9 | global $wpp_settings; |
| 10 | |
| 11 | if ( $wpp_settings['conv_permalinks'] == 'enable' ) { |
| 12 | add_filter( 'posts_where', 'wpp_posts_where' ); |
| 13 | add_action( 'pre_get_posts', 'wpp_pre_get_posts' ); |
| 14 | add_filter( 'post_link', 'wpp_permalink', 10, 3 ); |
| 15 | } |
| 16 | |
| 17 | /** |
| 18 | * Converts post date pointer to Jalali pointer |
| 19 | * |
| 20 | * @param string $where |
| 21 | * @return string |
| 22 | */ |
| 23 | function wpp_posts_where( $where ) { |
| 24 | global $wp_query, $wpdb ; |
| 25 | if ( empty( $wp_query->query_vars ) ) |
| 26 | return $where; |
| 27 | |
| 28 | $pd = bn_parsidate::getInstance(); |
| 29 | |
| 30 | $m = ( isset( $wp_query->query_vars['m'] ) ) ? $wp_query->query_vars['m'] : ''; |
| 31 | $hour = ( isset( $wp_query->query_vars['hour'] ) ) ? $wp_query->query_vars['hour'] : ''; |
| 32 | $minute = ( isset( $wp_query->query_vars['minute'] ) ) ? $wp_query->query_vars['minute'] : ''; |
| 33 | $second = ( isset( $wp_query->query_vars['second'] ) ) ? $wp_query->query_vars['second'] : ''; |
| 34 | $year = ( isset( $wp_query->query_vars['year'] ) ) ? $wp_query->query_vars['year'] : ''; |
| 35 | $month = ( isset( $wp_query->query_vars['month'] ) ) ? $wp_query->query_vars['month'] : ''; |
| 36 | $day = ( isset( $wp_query->query_vars['day'] ) ) ? $wp_query->query_vars['day'] : ''; |
| 37 | |
| 38 | if ( ! empty( $m ) ) { |
| 39 | $len = strlen( $m ); |
| 40 | $year = substr( $m, 0, 4 ); |
| 41 | if ( $len > 5 ) |
| 42 | $month = substr( $m, 4, 2 ); |
| 43 | if ( $len > 7 ) |
| 44 | $day = substr( $m, 6, 2 ); |
| 45 | if ( $len > 9 ) |
| 46 | $hour = substr( $m, 8, 2 ); |
| 47 | if ( $len > 11 ) |
| 48 | $minute = substr( $m, 10, 2 ); |
| 49 | if ( $len > 13 ) |
| 50 | $second = substr( $m, 12, 2 ); |
| 51 | } |
| 52 | |
| 53 | if ( empty( $year ) || $year > 1700 ) |
| 54 | return $where; |
| 55 | |
| 56 | $stamon = 1; |
| 57 | $staday = 1; |
| 58 | $stahou = '00'; |
| 59 | $stamin = '00'; |
| 60 | $stasec = '00'; |
| 61 | $endmon = 1; |
| 62 | $endday = 1; |
| 63 | $endhou = '00'; |
| 64 | $endmin = '00'; |
| 65 | $endsec = '00'; |
| 66 | |
| 67 | $stayear = $year; |
| 68 | $endyear = $year+1; |
| 69 | |
| 70 | if ( $month != '' ) { |
| 71 | $stamon = $month; |
| 72 | $endmon = ( $month == 12 ? 1 : $month + 1 ); |
| 73 | $endyear= ( $endmon == 1 ? $stayear + 1 : $stayear ); |
| 74 | } |
| 75 | |
| 76 | if ( $day != '' ) { |
| 77 | $staday = $day; |
| 78 | $endday = ( $day == $pd->j_days_in_month[(int)$month-1] ? 1 : $day + 1 ); |
| 79 | $endmon = ( $endday == 1 ? $stamon + 1 : $stamon ); |
| 80 | } |
| 81 | |
| 82 | if ( $hour != '' ) { |
| 83 | $stahou = $hour; |
| 84 | $endhou = ( $hour == 24 ? '00' : $hour+1 ); |
| 85 | $endday = ( $endhou == '00' ? $staday + 1 : $staday ); |
| 86 | } |
| 87 | |
| 88 | if ( $minute != '' ) { |
| 89 | $stamin = $minute; |
| 90 | $endmin = ( $minute == 59 ? '00' : $minute+1 ); |
| 91 | $endhou = ( $endmin == '00' ? $stahou + 1 : $stahou ); |
| 92 | } |
| 93 | |
| 94 | if ( $second != '' ) { |
| 95 | $stasec = $second; |
| 96 | $endsec = ( $second == 59 ? '00' : $second + 1 ); |
| 97 | $endmin = ( $endsec == '00' ? $stamin + 1: $stamin ); |
| 98 | } |
| 99 | |
| 100 | $stadate = "$stayear-$stamon-$staday"; |
| 101 | $enddate = "$endyear-$endmon-$endday"; |
| 102 | $stadate = gregdate( 'Y-m-d', $stadate ); |
| 103 | $enddate = gregdate( 'Y-m-d', $enddate ); |
| 104 | $stadate .= " $stahou:$stamin:$stasec"; |
| 105 | $enddate .= " $endhou:$endmin:$endsec"; |
| 106 | |
| 107 | $patterns = array('/YEAR\((.*?)post_date\s*\)\s*=\s*[0-9\']*/', |
| 108 | '/DAYOFMONTH\((.*?)post_date\s*\)\s*=\s*[0-9\']*/', |
| 109 | '/MONTH\((.*?)post_date\s*\)\s*=\s*[0-9\']*/', |
| 110 | '/HOUR\((.*?)post_date\s*\)\s*=\s*[0-9\']*/', |
| 111 | '/MINUTE\((.*?)post_date\s*\)\s*=\s*[0-9\']*/', |
| 112 | '/SECOND\((.*?)post_date\s*\)\s*=\s*[0-9\']*/'); |
| 113 | foreach( $patterns as $pattern ) |
| 114 | $where = preg_replace( $pattern, '1=1', $where ); |
| 115 | |
| 116 | $prefixp = "{$wpdb->posts}."; |
| 117 | $prefixp = ( strpos( $where, $prefixp ) == false ) ? '' : $prefixp; |
| 118 | |
| 119 | $where .= " AND {$prefixp}post_date >= '$stadate' AND {$prefixp}post_date < '$enddate' "; |
| 120 | return $where; |
| 121 | } |
| 122 | |
| 123 | /** |
| 124 | * Converts post dates to Georgian dates for preventing errors |
| 125 | * |
| 126 | * @param WP_Query $query |
| 127 | * @return mixed |
| 128 | */ |
| 129 | function wpp_pre_get_posts( $query ) { |
| 130 | global $wpdb; |
| 131 | |
| 132 | $permalink = $query->query; |
| 133 | $year = ''; |
| 134 | $monthnum = ''; |
| 135 | $day = '';//start |
| 136 | |
| 137 | if ( isset( $permalink['year'] ) ) |
| 138 | $year = $permalink['year']; |
| 139 | if ( isset( $permalink['monthnum'] ) ) |
| 140 | $monthnum = $permalink['monthnum']; |
| 141 | if ( isset( $permalink['day'] ) ) |
| 142 | $day = $permalink['day']; |
| 143 | if($year > 1700) |
| 144 | return $query; |
| 145 | |
| 146 | $out = false; |
| 147 | $pd = bn_parsidate::getInstance(); |
| 148 | if ( isset( $permalink['name'] ) ) { |
| 149 | $var = $wpdb->get_var( "SELECT post_date FROM {$wpdb->prefix}posts WHERE post_name='{$permalink['name']}' ORDER BY id" ); |
| 150 | $per = parsidate( 'Y-m-d', $var, 'eng' ); |
| 151 | //update_option('options', $per ); |
| 152 | $per = explode( '-', $per ); |
| 153 | $out = true; |
| 154 | |
| 155 | if ( $year != $per[0] ) |
| 156 | $out = false; |
| 157 | if ( $out && $monthnum != $per[1]) |
| 158 | $out = false; |
| 159 | if ( $out && $day != $per[2]) |
| 160 | $out = false; |
| 161 | |
| 162 | } elseif(isset($permalink['post_id'])) { |
| 163 | $out = true; |
| 164 | $var = $wpdb->get_var( "SELECT post_date FROM {$wpdb->prefix}posts WHERE ID={$permalink['post_id']}" ); |
| 165 | } elseif( ! empty( $year ) && ! empty( $monthnum ) && ! empty( $day ) ) { |
| 166 | $out = true; |
| 167 | $var = gregdate( 'Y-m-d', "$year-$monthnum-$day" ); |
| 168 | }elseif(! empty( $year ) && ! empty( $monthnum )){ |
| 169 | $stadate = $pd->persian_to_gregorian($year,$monthnum,1); |
| 170 | $enddate = $pd->persian_to_gregorian($year,$monthnum,$pd->j_days_in_month[($monthnum-1)]); |
| 171 | $date_query = array( |
| 172 | array( |
| 173 | 'after' => array( |
| 174 | 'year' => $stadate[0], |
| 175 | 'month' => $stadate[1], |
| 176 | 'day' => $stadate[2] - 1, |
| 177 | ), |
| 178 | 'before' => array( |
| 179 | 'year' => $enddate[0], |
| 180 | 'month' => $enddate[1], |
| 181 | 'day' => $enddate[2] + 1, |
| 182 | ), |
| 183 | 'inclusive' => TRUE, |
| 184 | ), |
| 185 | ); |
| 186 | $query->set('date_query', $date_query); |
| 187 | |
| 188 | // commented for get year & month in calander widget |
| 189 | // $query->set('year', ''); |
| 190 | // $query->set('monthnum', ''); |
| 191 | $out = false; |
| 192 | |
| 193 | }elseif(! empty( $year )){ |
| 194 | $stadate = $pd->persian_to_gregorian($year,1,1); |
| 195 | $enddate = $pd->persian_to_gregorian(($year+1),1,1); |
| 196 | $date_query = array( |
| 197 | array( |
| 198 | 'after' => array( |
| 199 | 'year' => $stadate[0], |
| 200 | 'month' => $stadate[1], |
| 201 | 'day' => $stadate[2] - 1, |
| 202 | ), |
| 203 | 'before' => array( |
| 204 | 'year' => $enddate[0], |
| 205 | 'month' => $enddate[1], |
| 206 | 'day' => $enddate[2], |
| 207 | ), |
| 208 | 'inclusive' => TRUE, |
| 209 | ), |
| 210 | ); |
| 211 | $query->set('date_query', $date_query); |
| 212 | // $query->set('year', ''); |
| 213 | $out = false; |
| 214 | } |
| 215 | |
| 216 | if ( $out ) { |
| 217 | preg_match_all( '!\d+!', $var, $matches ); |
| 218 | $var = $matches[0]; |
| 219 | |
| 220 | $query->set( 'year', $var[0] ); |
| 221 | $query->set( 'monthnum', $var[1] ); |
| 222 | $query->set( 'day', $var[2] ); |
| 223 | } |
| 224 | |
| 225 | // $query->set('') |
| 226 | |
| 227 | return $query; |
| 228 | |
| 229 | } |
| 230 | |
| 231 | /** |
| 232 | * Convert permalink structure to Jalali format |
| 233 | * |
| 234 | * @param mixed $perma |
| 235 | * @param WP_Post $post |
| 236 | * @param bool $leavename |
| 237 | * @return string New permalink |
| 238 | */ |
| 239 | function wpp_permalink( $perma, $post, $leavename = false ) { |
| 240 | if ( empty( $post->ID ) ) |
| 241 | return false; |
| 242 | if ( $post->post_type == 'page' || $post->post_status == 'static' ) |
| 243 | return get_page_link( $post->ID ); |
| 244 | elseif( $post->post_type == 'attachment' ) |
| 245 | return get_attachment_link( $post->ID ); |
| 246 | elseif( in_array( $post->post_type, get_post_types( array( '_builtin' => false ) ) ) ) |
| 247 | return get_post_permalink( $post->ID ); |
| 248 | |
| 249 | $permalink = get_option( 'permalink_structure' ); |
| 250 | preg_match_all( '/%([^\/]*)%/', $permalink, $rewritecode ); |
| 251 | $rewritecode = $rewritecode[0]; |
| 252 | if ( '' != $permalink && ! in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) { |
| 253 | if ( $leavename ) |
| 254 | $rewritecode = array_diff( $rewritecode, array( '%postname%', '%pagename%' ) ); |
| 255 | |
| 256 | $date = explode( ' ', parsidate( 'Y m d H i s', $post->post_date, 'eng' ) ); |
| 257 | $out = array(); |
| 258 | |
| 259 | foreach( $rewritecode as $rewrite ) { |
| 260 | switch( $rewrite ) { |
| 261 | case '%year%': |
| 262 | $out[] = $date[0]; |
| 263 | break; |
| 264 | case '%monthnum%': |
| 265 | $out[] = $date[1]; |
| 266 | break; |
| 267 | case '%day%': |
| 268 | $out[] = $date[2]; |
| 269 | break; |
| 270 | case '%hour%': |
| 271 | $out[] = $date[3]; |
| 272 | break; |
| 273 | case '%minute%': |
| 274 | $out[] = $date[4]; |
| 275 | break; |
| 276 | case '%second%': |
| 277 | $out[] = $date[5]; |
| 278 | break; |
| 279 | case '%post_id%': |
| 280 | $out[] = $post->ID; |
| 281 | break; |
| 282 | case '%postname%': |
| 283 | $out[] = $post->post_name; |
| 284 | break; |
| 285 | case '%category%': |
| 286 | $category = ''; |
| 287 | $cats = get_the_category( $post->ID ); |
| 288 | if ( $cats ) { |
| 289 | usort( $cats, '_usort_terms_by_ID' ); |
| 290 | $category = $cats[0]->slug; |
| 291 | if ( $parent = $cats[0]->parent ) |
| 292 | $category = get_category_parents( $parent, false, '/', true ); |
| 293 | |
| 294 | if($cats[0]->parent != 0) |
| 295 | $category .= $cats[0]->slug ; |
| 296 | } |
| 297 | if ( empty( $category ) ) { |
| 298 | $default_category = get_term( get_option( 'default_category' ), 'category' ); |
| 299 | $category = is_wp_error( $default_category ) ? '' : $default_category->slug; |
| 300 | } |
| 301 | $out[] = $category; |
| 302 | break; |
| 303 | case '%author%': |
| 304 | $authordata = get_userdata( $post->post_author ); |
| 305 | $out[] = $authordata->user_nicename; |
| 306 | break; |
| 307 | case '%pagename%': |
| 308 | $out[] = $post->post_name; |
| 309 | break; |
| 310 | default: |
| 311 | unset( $rewritecode[array_search( $rewrite, $rewritecode )] ); |
| 312 | break; |
| 313 | } |
| 314 | } |
| 315 | $permalink = home_url( str_replace( $rewritecode, $out, $permalink ) ); |
| 316 | return user_trailingslashit( $permalink, 'single' ); |
| 317 | } else { |
| 318 | return home_url( "?p=$post->ID" ); |
| 319 | } |
| 320 | } |
| 321 | ?> |