ASong2U_Web/wp-content/plugins/events-manager/classes/em-permalinks.php

242 lines
11 KiB
PHP
Raw Normal View History

<?php
if( !class_exists('EM_Permalinks') ){
class EM_Permalinks {
static $em_queryvars = array(
'event_id','event_slug', 'em_redirect',
'location_id','location_slug',
'person_id',
'booking_id',
'category_id', 'category_slug',
'ticket_id',
'calendar_day',
'rss', 'ical', 'bookings_page','event_categories','event_locations'
);
function init(){
add_filter('pre_update_option_dbem_events_page', array('EM_Permalinks','option_update'));
if( get_option('dbem_flush_needed') ){
add_filter('init', array('EM_Permalinks','flush'));
}
add_filter('rewrite_rules_array',array('EM_Permalinks','rewrite_rules_array'));
add_filter('query_vars',array('EM_Permalinks','query_vars'));
add_action('parse_query',array('EM_Permalinks','init_objects'), 1);
add_action('parse_query',array('EM_Permalinks','redirection'), 1);
if( !defined('EM_EVENT_SLUG') ){ define('EM_EVENT_SLUG','event'); }
if( !defined('EM_LOCATION_SLUG') ){ define('EM_LOCATION_SLUG','location'); }
if( !defined('EM_LOCATIONS_SLUG') ){ define('EM_LOCATIONS_SLUG','locations'); }
if( !defined('EM_CATEGORY_SLUG') ){ define('EM_CATEGORY_SLUG','category'); }
if( !defined('EM_CATEGORIES_SLUG') ){ define('EM_CATEGORIES_SLUG','categories'); }
add_filter('post_type_archive_link',array('EM_Permalinks','post_type_archive_link'),10,2);
}
function flush(){
global $wp_rewrite;
$wp_rewrite->flush_rules();
delete_option('dbem_flush_needed');
}
function post_type_archive_link($link, $post_type){
if( $post_type == EM_POST_TYPE_EVENT ){
if( get_option('dbem_events_page') ){
$new_link = get_permalink(get_option('dbem_events_page'));
}
}
if( $post_type == EM_POST_TYPE_LOCATION ){
if( get_option('dbem_locations_page') ){
$new_link = get_permalink(get_option('dbem_locations_page'));
}
}
if( !empty($new_link) ){
$link = $new_link;
}
return $link;
}
/**
* will redirect old links to new link structures.
* @return mixed
*/
function redirection(){
global $wpdb, $wp_rewrite, $post, $wp_query;
if( is_object($wp_query) && $wp_query->get('em_redirect') ){
//is this a querystring url?
if( $wp_query->get('event_slug') ){
$event = $wpdb->get_row('SELECT event_id, post_id FROM '.EM_EVENTS_TABLE." WHERE event_slug='".$wp_query->get('event_slug')."' AND (blog_id=".get_current_blog_id()." OR blog_id IS NULL OR blog_id=0)", ARRAY_A);
if( !empty($event) ){
$EM_Event = em_get_event($event['event_id']);
$url = get_permalink($EM_Event->post_id);
}
}elseif( $wp_query->get('location_slug') ){
$location = $wpdb->get_row('SELECT location_id, post_id FROM '.EM_LOCATIONS_TABLE." WHERE location_slug='".$wp_query->get('location_slug')."' AND (blog_id=".get_current_blog_id()." OR blog_id IS NULL OR blog_id=0)", ARRAY_A);
if( !empty($location) ){
$EM_Location = em_get_location($location['location_id']);
$url = get_permalink($EM_Location->post_id);
}
}elseif( $wp_query->get('category_slug') ){
$url = get_term_link($wp_query->get('category_slug'), EM_TAXONOMY_CATEGORY);
}
if(!empty($url)){
wp_redirect($url,301);
exit();
}
}
}
// Adding a new rule
function rewrite_rules_array($rules){
//get the slug of the event page
$events_page_id = get_option ( 'dbem_events_page' );
$events_page = get_post($events_page_id);
$em_rules = array();
if( is_object($events_page) ){
$events_slug = preg_replace('/\/$/', '', str_replace( trailingslashit(home_url()), '', get_permalink($events_page_id)) );
$events_slug = ( !empty($events_slug) ) ? trailingslashit($events_slug) : $events_slug;
$em_rules[$events_slug.'(\d{4}-\d{2}-\d{2})$'] = 'index.php?pagename='.$events_slug.'&calendar_day=$matches[1]'; //event calendar date search
$em_rules[$events_slug.'rss$'] = 'index.php?pagename='.$events_slug.'&rss=1'; //rss page
$em_rules[$events_slug.'feed$'] = 'index.php?pagename='.$events_slug.'&rss=1'; //compatible rss page
if( EM_POST_TYPE_EVENT_SLUG.'/' == $events_slug ){ //won't apply on homepage
//make sure we hard-code rewrites for child pages of events
$child_posts = get_posts(array('post_type'=>'page', 'post_parent'=>$events_page->ID, 'numberposts'=>0));
foreach($child_posts as $child_post){
$em_rules[$events_slug.$child_post->post_name.'/?$'] = 'index.php?page_id='.$child_post->ID; //single event booking form with slug
}
}
if( EM_MS_GLOBAL && !get_site_option('dbem_ms_global_events_links', true) ){
//MS Mode has slug also for global links
$em_rules[$events_slug.get_site_option('dbem_ms_events_slug',EM_EVENT_SLUG).'/(.+)$'] = 'index.php?pagename='.$events_slug.'&em_redirect=1&event_slug=$matches[1]'; //single event from subsite
}
//add redirection for backwards compatability
$em_rules[$events_slug.EM_EVENT_SLUG.'/(.+)$'] = 'index.php?pagename='.$events_slug.'&em_redirect=1&event_slug=$matches[1]'; //single event
$em_rules[$events_slug.EM_LOCATION_SLUG.'/(.+)$'] = 'index.php?pagename='.$events_slug.'&em_redirect=1&location_slug=$matches[1]'; //single location page
$em_rules[$events_slug.EM_CATEGORY_SLUG.'/(.+)$'] = 'index.php?pagename='.$events_slug.'&em_redirect=1&category_slug=$matches[1]'; //single category page slug
//add a rule that ensures that the events page is found and used over other pages
$em_rules[trim($events_slug,'/').'/?$'] = 'index.php?pagename='.trim($events_slug,'/') ;
}else{
$events_slug = EM_POST_TYPE_EVENT_SLUG;
$em_rules[$events_slug.'/(\d{4}-\d{2}-\d{2})$'] = 'index.php?post_type='.EM_POST_TYPE_EVENT.'&calendar_day=$matches[1]'; //event calendar date search
if( !get_option( 'dbem_my_bookings_page') || !is_object(get_post(get_option( 'dbem_my_bookings_page'))) ){ //only added if bookings page isn't assigned
$em_rules[$events_slug.'/my\-bookings$'] = 'index.php?post_type='.EM_POST_TYPE_EVENT.'&bookings_page=1'; //page for users to manage bookings
}
//check for potentially conflicting posts with the same slug as events
$conflicting_posts = get_posts(array('name'=>EM_POST_TYPE_EVENT_SLUG, 'post_type'=>'any', 'numberposts'=>0));
if( count($conflicting_posts) > 0 ){ //won't apply on homepage
foreach($conflicting_posts as $conflicting_post){
//make sure we hard-code rewrites for child pages of events
$child_posts = get_posts(array('post_type'=>'any', 'post_parent'=>$conflicting_post->ID, 'numberposts'=>0));
foreach($child_posts as $child_post){
$em_rules[EM_POST_TYPE_EVENT_SLUG.'/'.$child_post->post_name.'/?$'] = 'index.php?page_id='.$child_post->ID; //single event booking form with slug
}
}
}
}
//make sure there's no page with same name as archives, that should take precedence as it can easily be deleted wp admin side
$em_query = new WP_Query(array('pagename'=>EM_POST_TYPE_EVENT_SLUG));
if( $em_query->have_posts() ){
$em_rules[trim(EM_POST_TYPE_EVENT_SLUG,'/').'/?$'] = 'index.php?pagename='.trim(EM_POST_TYPE_EVENT_SLUG,'/') ;
wp_reset_postdata();
}
//make sure there's no page with same name as archives, that should take precedence as it can easily be deleted wp admin side
$em_query = new WP_Query(array('pagename'=>EM_POST_TYPE_LOCATION_SLUG));
if( $em_query->have_posts() ){
$em_rules[trim(EM_POST_TYPE_LOCATION_SLUG,'/').'/?$'] = 'index.php?pagename='.trim(EM_POST_TYPE_LOCATION_SLUG,'/') ;
wp_reset_postdata();
}
//If in MS global mode and locations are linked on same site
if( EM_MS_GLOBAL && !get_site_option('dbem_ms_global_locations_links', true) ){
$locations_page_id = get_option ( 'dbem_locations_page' );
$locations_page = get_post($locations_page_id);
if( is_object($locations_page) ){
$locations_slug = preg_replace('/\/$/', '', str_replace( trailingslashit(home_url()), '', get_permalink($locations_page_id) ));
$em_rules[$locations_slug.'/'.get_site_option('dbem_ms_locations_slug',EM_LOCATION_SLUG).'/(.+)$'] = 'index.php?pagename='.$locations_slug.'&location_slug=$matches[1]'; //single event booking form with slug
}
}
//add ical endpoint
$em_rules[EM_POST_TYPE_EVENT_SLUG."/([^/]+)/ical/?$"] = 'index.php?event=$matches[1]&ical=1';
return $em_rules + $rules;
}
/**
* Depreciated, use get_post_permalink() from now on or the output function with a placeholder
* Generate a URL. Pass each section of a link as a parameter, e.g. EM_Permalinks::url('event',$event_id); will create an event link.
* @param mixed
*/
function url(){
global $wp_rewrite;
$args = func_get_args();
$em_uri = get_permalink(get_option("dbem_events_page")); //PAGE URI OF EM
if ( $wp_rewrite->using_permalinks() /*&& !defined('EM_DISABLE_PERMALINKS')*/ ) {
$event_link = trailingslashit(trailingslashit($em_uri). implode('/',$args));
}
return $event_link;
}
/**
* checks if the events page has changed, and sets a flag to flush wp_rewrite.
* @param mixed $val
* @return mixed
*/
function option_update( $val ){
if( get_option('dbem_events_page') != $val ){
update_option('dbem_flush_needed',1);
}
return $val;
}
// Adding the id var so that WP recognizes it
function query_vars($vars){
foreach(self::$em_queryvars as $em_queryvar){
array_push($vars, $em_queryvar);
}
return $vars;
}
/**
* Not the "WP way" but for now this'll do!
*/
function init_objects(){
global $wp_query, $wp_rewrite;
//check some homepage conditions
$events_page_id = get_option ( 'dbem_events_page' );
if( is_object($wp_query) && $wp_query->is_home && 'page' == get_option('show_on_front') && get_option('page_on_front') == $events_page_id ){
$wp_query->is_page = true;
$wp_query->is_home = false;
$wp_query->query_vars['page_id'] = $events_page_id;
}
if ( is_object($wp_query) && is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) {
foreach(self::$em_queryvars as $em_queryvar){
if( $wp_query->get($em_queryvar) ) {
$_REQUEST[$em_queryvar] = $wp_query->get($em_queryvar);
}
}
}
//dirty rss condition
if( !empty($_REQUEST['rss']) ){
$_REQUEST['rss_main'] = 'main';
}
}
}
EM_Permalinks::init();
}
//Specific links that aren't generated by objects
/**
* returns the url of the my bookings page, depending on the settings page and if BP is installed.
* @return string
*/
function em_get_my_bookings_url(){
global $bp, $wp_rewrite;
if( is_object($bp) ){
//get member url
return $bp->events->link.'attending/';
}elseif( get_option('dbem_my_bookings_page') ){
return get_permalink(get_option('dbem_my_bookings_page'));
}else{
if( $wp_rewrite->using_permalinks() && !defined('EM_DISABLE_PERMALINKS') ){
return trailingslashit(EM_URI)."my-bookings/";
}else{
return preg_match('/\?/',EM_URI) ? EM_URI.'&bookings_page=1':EM_URI.'?bookings_page=1';
}
}
}