Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. add_action( 'pre_get_posts', 'date_archive_query' );
  2.  
  3. function date_archive_query( $query ) {
  4.  
  5. if ( !is_admin() && $query->is_main_query() ) {
  6. // not an admin page and is the main query
  7.  
  8. if ( is_date() ) {
  9. // date archive
  10.  
  11. $dates = get_start_and_end_date();
  12.  
  13. $reset_query_vars = array(
  14. 'second' , 'minute', 'hour',
  15. 'day', 'monthnum', 'year',
  16. 'w', 'm',
  17. );
  18.  
  19. // reset date query vars
  20. foreach ( $reset_query_vars as $var ) {
  21. $query->set( $var, '' );
  22. }
  23.  
  24. $query->set( 'post_type', 'post' );
  25. $query->set( 'posts_per_page', 10 );
  26. $query->set( 'meta_key', 'event_start_date' );
  27. $query->set( 'orderby', 'meta_value_num' );
  28. $query->set( 'order', 'ASC' );
  29.  
  30. $meta_query = array(
  31. 'relation' => 'AND',
  32.  
  33. // needs to be two meta key arrays
  34. array(
  35. 'key' => 'event_end_date',
  36. 'compare' => '<=',
  37. 'value' => $dates['end_date'],
  38. 'type' => 'DATE'
  39. ),
  40. array(
  41. 'key' => 'event_start_date',
  42. 'compare' => '>=',
  43. 'value' => $dates['start_date'],
  44. 'type' => 'DATE'
  45. ),
  46.  
  47. );
  48.  
  49. $query->set( 'meta_query', $meta_query );
  50.  
  51. // add the filter
  52. add_filter( 'get_meta_sql', 'get_meta_sql_date', 10, 2 );
  53.  
  54. // remove the filter down the road
  55. add_filter( 'the_posts', 'remove_get_meta_sql_filter' );
  56. }
  57. }
  58. }
  59.  
  60.  
  61. function get_start_and_end_date() {
  62.  
  63. //check what type of date archive we are on and if query vars are available
  64. $m = ( get_query_var( 'm' ) ) ? get_query_var( 'm' ) : false;
  65.  
  66. $year = ( get_query_var( 'year' ) ) ? get_query_var( 'year' ) : false;
  67. $month = ( get_query_var( 'monthnum' ) ) ? zeroise( get_query_var( 'monthnum' ), 2 ) : false;
  68. $day = ( get_query_var( 'day' ) ) ? get_query_var( 'day' ) : false;
  69.  
  70. if ( $m ) {
  71. // Custom permalinks structure is not enabled
  72. switch ( strlen( $m ) ) {
  73. case 4: // Yearly
  74. $year = substr( $m, 0, 4 );
  75. break;
  76. case 6: // Monthly
  77. $year = substr( $m, 0, 4 );
  78. $month = substr( $m, 4, 2 );
  79. break;
  80. case 8: // Daily
  81. $year = substr( $m, 0, 4 );
  82. $month = substr( $m, 4, 2 );
  83. $day = substr( $m, 6, 2 );
  84. break;
  85. }
  86. }
  87.  
  88. if ( is_year() && $year ) {
  89. $start_date = $year . '0101';
  90. $end_date = $year . '1231';
  91. }
  92.  
  93. if ( is_month() && $year && $month ) {
  94. $start_date = $year . $month . '01';
  95. $end_date = date( 'Ymt', mktime( 23, 59, 59, $month, 1, $year ) ); // 't' gets the last day
  96. }
  97.  
  98. if ( is_day() && $year && $month && $day ) {
  99. $start_date = $year . $month . $day;
  100. $end_date = $start_date;
  101. }
  102.  
  103. return compact( 'start_date', 'end_date' );
  104. }
  105.  
  106.  
  107. // sortable posts by custom date field for long period events
  108. function get_meta_sql_date( $pieces, $queries ) {
  109. global $wpdb;
  110.  
  111. $event_start_date = $event_end_date = '';
  112.  
  113. // get start and end date from query
  114. foreach ( $queries as $q ) {
  115.  
  116. if ( !isset( $q['key'] ) ) {
  117. return $pieces;
  118. }
  119.  
  120. if ( 'event_start_date' === $q['key'] ) {
  121. $event_start_date = isset( $q['value'] ) ? $q['value'] : '';
  122. }
  123. if ( 'event_end_date' === $q['key'] ) {
  124. $event_end_date = isset( $q['value'] ) ? $q['value'] : '';
  125. }
  126. }
  127.  
  128. if ( ( '' === trim( $event_start_date ) ) || ( '' === trim( $event_end_date ) ) ) {
  129. return $pieces;
  130. }
  131.  
  132. // Match all meta table aliases with their meta keys (wp_postmeta or mt1, mt2 etc..).
  133. $pattern = "/($wpdb->postmeta|mt\d+)\.meta_key\s*=\s*'(event_start_date|event_end_date)'/";
  134. preg_match_all( $pattern , $pieces['where'], $matches );
  135.  
  136. if ( !( isset( $matches[1] ) && isset( $matches[2] ) ) ) {
  137. return $pieces;
  138. }
  139.  
  140. if ( empty( $matches[1] ) || empty( $matches[2] ) ) {
  141. return $pieces;
  142. }
  143.  
  144. $query = $start_prefix = $end_prefix = '';
  145. $prefix = $keys = array();
  146.  
  147. // count is 3 with 'orderby' and a 'meta_key'
  148. if ( ( 3 === count( $matches[2] ) ) && ( 3 === count( $matches[1] ) ) ) {
  149. $query .= " AND ({$matches[1][0]}.meta_key = '{$matches[2][0]}')";
  150. $prefix = array_slice( $matches[1], 1 );
  151. $keys = array_slice( $matches[2], 1 );
  152. } else {
  153. if ( ( 2 === count( $matches[2] ) ) && ( 2 === count( $matches[1] ) ) ) {
  154. $prefix = $matches[1];
  155. $keys = $matches[2];
  156. } else {
  157. // Wrong query
  158. return $pieces;
  159. }
  160. }
  161.  
  162. foreach ( $keys as $key => $value ) {
  163. if ( 'event_start_date' === $value ) {
  164. $start_prefix = $prefix[ $key ];
  165. }
  166. if ( 'event_end_date' === $value ) {
  167. $end_prefix = $prefix[ $key ];
  168. }
  169. }
  170.  
  171. if ( empty( $start_prefix ) || empty( $end_prefix ) || $start_prefix === $end_prefix ) {
  172. return $pieces;
  173. }
  174.  
  175. // after start date AND before end date
  176. $_query = " AND (
  177. ( $start_prefix.meta_key = 'event_start_date' AND ( CAST($start_prefix.meta_value AS DATE) >= %s) )
  178. AND ( $end_prefix.meta_key = 'event_end_date' AND ( CAST($end_prefix.meta_value AS DATE) <= %s) )
  179. )";
  180. $query .= $wpdb->prepare( $_query, $event_start_date, $event_end_date );
  181.  
  182. // OR before start date AND after end end date
  183. $_query = " OR (
  184. ( $start_prefix.meta_key = 'event_start_date' AND ( CAST($start_prefix.meta_value AS DATE) <= %s) )
  185. AND ( $end_prefix.meta_key = 'event_end_date' AND ( CAST($end_prefix.meta_value AS DATE) >= %s) )
  186. )";
  187. $query .= $wpdb->prepare( $_query, $event_start_date, $event_end_date );
  188.  
  189. // OR before start date AND (before end date AND end date after start date)
  190. $_query = " OR (
  191. ( $start_prefix.meta_key = 'event_start_date' AND ( CAST($start_prefix.meta_value AS DATE) <= %s) )
  192. AND ( $end_prefix.meta_key = 'event_end_date'
  193. AND ( CAST($end_prefix.meta_value AS DATE) <= %s )
  194. AND ( CAST($end_prefix.meta_value AS DATE) >= %s )
  195. )
  196. )";
  197. $query .= $wpdb->prepare( $_query, $event_start_date, $event_end_date, $event_start_date );
  198.  
  199. // OR after end date AND (after start date AND start date before end date) )
  200. $_query = "OR (
  201. ( $end_prefix.meta_key = 'event_end_date' AND ( CAST($end_prefix.meta_value AS DATE) >= %s ) )
  202. AND ( $start_prefix.meta_key = 'event_start_date'
  203. AND ( CAST($start_prefix.meta_value AS DATE) >= %s )
  204. AND ( CAST($start_prefix.meta_value AS DATE) <= %s )
  205. )
  206. )";
  207. $query .= $wpdb->prepare( $_query, $event_end_date, $event_start_date, $event_end_date );
  208.  
  209. $pieces['where'] = $query;
  210.  
  211. return $pieces;
  212. }
  213.  
  214.  
  215. function remove_get_meta_sql_filter( $posts ) {
  216. remove_filter( 'get_meta_sql', 'get_meta_sql_date', 10, 2 );
  217. return $posts;
  218. }
  219.  
  220.  
  221. add_action( 'save_post', 'validate_event_meta' );
  222.  
  223. // adds event_start_date meta if only event_end_date was submitted.
  224. function validate_event_meta( $post_id ) {
  225.  
  226. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
  227. return $post_id;
  228. }
  229.  
  230. if ( !current_user_can( 'edit_post', $post_id ) ) {
  231. return $post_id;
  232. }
  233.  
  234. $post_type = ( isset( $_POST['post_type'] ) ) ? $_POST['post_type'] : '';
  235.  
  236. if ( 'post' !== $post_type ) {
  237. return $post_id;
  238. }
  239.  
  240. $event_end_date = get_post_meta( $post_id, 'event_end_date', true );
  241. if ( !empty( $event_end_date ) ) {
  242. if ( !get_post_meta( $post_id, 'event_start_date', true ) ) {
  243. update_post_meta( $post_id, 'event_start_date', $event_end_date );
  244. }
  245. }
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement