/** * The base method for creating a new Rewrite rule * * @param array|string $regex The regular expression to catch the URL * @param array $args The arguments in which the regular expression "alias" to * * @return Tribe__Events__Rewrite */ public function add($regex, $args = array()) { $regex = (array) $regex; $default = array(); $args = array_filter(wp_parse_args($args, $default)); $url = add_query_arg($args, 'index.php'); // Optional Trailing Slash $regex[] = '?$'; // Glue the pieces with slashes $regex = implode('/', array_filter($regex)); // Add the Bases to the regex foreach ($this->bases as $key => $value) { $regex = str_replace(array('{{ ' . $key . ' }}', '{{' . $key . '}}'), $value, $regex); } // Apply the Preg Indexes to the URL preg_match_all('/%([0-9])/', $url, $matches); foreach (end($matches) as $index) { $url = str_replace('%' . $index, $this->rewrite->preg_index($index), $url); } // Add the rule $this->rules[$regex] = $url; return $this; }
/** * This is a callback function to enable custom post type archive pages. * This function will add new rewrite rules to the global $wp_rewrite variable. * Custom rewrite rules will support feeds and paging without any extra coding. (yeeey) * This function will be called by 'generate_rewrite_rules' filter. * Note that it is necessary to flush permalinks for this method to be called. * It might be useful to know that these rewrite rules will create new param called 'post_type_index'. * It can be used to check whether we are in custom post archive. * @param WP_Rewrite $wp_rewrite object that contains all the routing data * @return WP_Rewrite modified $wp_rewrite with my custom rewrite rules */ function pta_register_post_type_rewrite_rules($wp_rewrite) { extract(pta_get_settings()); if (empty($enabled_post_type_archives)) { return $wp_rewrite; } // if we don't have any enabled post type archives then might as well quit $custom_rules = array(); $url_base = $url_base == '' ? $url_base : $url_base . '/'; if ($use_rewrite_slug) { $customisations = $enabled_post_type_customisations; // just to make it shorter foreach ($enabled_post_type_archives as $post_type_slug) { $post_type = get_post_type_object($post_type_slug); if (!isset($post_type)) { continue; } // omg post type doesn't exist - continue with next one if (isset($customisations[$post_type_slug]) and !empty($customisations[$post_type_slug]['rewrite_slug'])) { $post_type = $enabled_post_type_customisations[$post_type_slug]['rewrite_slug']; } elseif (!empty($post_type->rewrite) and !empty($post_type->rewrite['slug'])) { $post_type = $post_type->rewrite['slug']; } else { $post_type = $post_type_slug; } $custom_rules["{$url_base}({$post_type})/([0-9]+)/([0-9]{1,2})/([0-9]{1,2})/?\$"] = "index.php?post_type_index=1&post_type={$post_type_slug}&year=" . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3) . '&day=' . $wp_rewrite->preg_index(4); $custom_rules["{$url_base}({$post_type})/([0-9]+)/([0-9]{1,2})/?\$"] = "index.php?post_type_index=1&post_type={$post_type_slug}&year=" . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3); $custom_rules["{$url_base}({$post_type})/([0-9]+/?\$)"] = "index.php?post_type_index=1&post_type={$post_type_slug}&year=" . $wp_rewrite->preg_index(2); $custom_rules["{$url_base}({$post_type})/page/?([0-9]{1,})/?\$"] = "index.php?post_type_index=1&post_type={$post_type_slug}&paged=" . $wp_rewrite->preg_index(2); $custom_rules["{$url_base}({$post_type})/(feed|rdf|rss|rss2|atom)/?\$"] = "index.php?post_type_index=1&post_type={$post_type_slug}&feed=" . $wp_rewrite->preg_index(2); $custom_rules["{$url_base}({$post_type})/?\$"] = "index.php?post_type_index=1&post_type={$post_type_slug}"; } } else { $enabled_post_type_archives = implode('|', $enabled_post_type_archives); $custom_rules = array("{$url_base}({$enabled_post_type_archives})/([0-9]+)/([0-9]{1,2})/([0-9]{1,2})/?\$" => 'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3) . '&day=' . $wp_rewrite->preg_index(4), "{$url_base}({$enabled_post_type_archives})/([0-9]+)/([0-9]{1,2})/?\$" => 'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3), "{$url_base}({$enabled_post_type_archives})/([0-9]+)/?\$" => 'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2), "{$url_base}({$enabled_post_type_archives})/page/?([0-9]{1,})/?\$" => 'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&paged=' . $wp_rewrite->preg_index(2), "{$url_base}({$enabled_post_type_archives})/(feed|rdf|rss|rss2|atom)/?\$" => 'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&feed=' . $wp_rewrite->preg_index(2), "{$url_base}({$enabled_post_type_archives})/?\$" => 'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1)); } $wp_rewrite->rules = array_merge($custom_rules, $wp_rewrite->rules); // merge existing rules with custom ones return $wp_rewrite; }
/** * Register bbPress-specific rewrite rules for uri's that are not * setup for us by way of custom post types or taxonomies. This includes: * - Front-end editing * - Topic views * - User profiles * * @since bbPress (r2688) * @param WP_Rewrite $wp_rewrite bbPress-sepecific rules are appended in * $wp_rewrite->rules */ public static function generate_rewrite_rules($wp_rewrite) { // Slugs $view_slug = bbp_get_view_slug(); $user_slug = bbp_get_user_slug(); // Unique rewrite ID's $edit_id = bbp_get_edit_rewrite_id(); $view_id = bbp_get_view_rewrite_id(); $user_id = bbp_get_user_rewrite_id(); $favs_id = bbp_get_user_favorites_rewrite_id(); $subs_id = bbp_get_user_subscriptions_rewrite_id(); $tops_id = bbp_get_user_topics_rewrite_id(); $reps_id = bbp_get_user_replies_rewrite_id(); // Rewrite rule matches used repeatedly below $root_rule = '/([^/]+)/?$'; $edit_rule = '/([^/]+)/edit/?$'; $feed_rule = '/([^/]+)/feed/?$'; $page_rule = '/([^/]+)/page/?([0-9]{1,})/?$'; // User profile rules $tops_rule = '/([^/]+)/topics/?$'; $reps_rule = '/([^/]+)/replies/?$'; $favs_rule = '/([^/]+)/' . bbp_get_user_favorites_slug() . '/?$'; $subs_rule = '/([^/]+)/' . bbp_get_user_subscriptions_slug() . '/?$'; $tops_page_rule = '/([^/]+)/topics/page/?([0-9]{1,})/?$'; $reps_page_rule = '/([^/]+)/replies/page/?([0-9]{1,})/?$'; $favs_page_rule = '/([^/]+)/' . bbp_get_user_favorites_slug() . '/page/?([0-9]{1,})/?$'; $subs_page_rule = '/([^/]+)/' . bbp_get_user_subscriptions_slug() . '/page/?([0-9]{1,})/?$'; // New bbPress specific rules to merge with existing that are not // handled automatically by custom post types or taxonomy types $bbp_rules = array(bbp_get_forum_slug() . $edit_rule => 'index.php?' . bbp_get_forum_post_type() . '=' . $wp_rewrite->preg_index(1) . '&' . $edit_id . '=1', bbp_get_topic_slug() . $edit_rule => 'index.php?' . bbp_get_topic_post_type() . '=' . $wp_rewrite->preg_index(1) . '&' . $edit_id . '=1', bbp_get_reply_slug() . $edit_rule => 'index.php?' . bbp_get_reply_post_type() . '=' . $wp_rewrite->preg_index(1) . '&' . $edit_id . '=1', bbp_get_topic_tag_tax_slug() . $edit_rule => 'index.php?' . bbp_get_topic_tag_tax_id() . '=' . $wp_rewrite->preg_index(1) . '&' . $edit_id . '=1', $user_slug . $tops_page_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $tops_id . '=1&paged=' . $wp_rewrite->preg_index(2), $user_slug . $reps_page_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $reps_id . '=1&paged=' . $wp_rewrite->preg_index(2), $user_slug . $favs_page_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $favs_id . '=1&paged=' . $wp_rewrite->preg_index(2), $user_slug . $subs_page_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $subs_id . '=1&paged=' . $wp_rewrite->preg_index(2), $user_slug . $tops_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $tops_id . '=1', $user_slug . $reps_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $reps_id . '=1', $user_slug . $favs_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $favs_id . '=1', $user_slug . $subs_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $subs_id . '=1', $user_slug . $edit_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1) . '&' . $edit_id . '=1', $user_slug . $root_rule => 'index.php?' . $user_id . '=' . $wp_rewrite->preg_index(1), $view_slug . $page_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index(1) . '&paged=' . $wp_rewrite->preg_index(2), $view_slug . $feed_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index(1) . '&feed=' . $wp_rewrite->preg_index(2), $view_slug . $root_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index(1)); // Merge bbPress rules with existing $wp_rewrite->rules = array_merge($bbp_rules, $wp_rewrite->rules); // Return merged rules return $wp_rewrite; }
/** * Add rewrite rules for .well-known. * * @param WP_Rewrite $wp_rewrite */ public static function rewrite_rules($wp_rewrite) { $well_known_rules = array('.well-known/(.+)' => 'index.php?well-known=' . $wp_rewrite->preg_index(1)); $wp_rewrite->rules = $well_known_rules + $wp_rewrite->rules; }
public function get_taxonomy_rules() { $rules = array($this->cat_base . '([^/]+)/(\\d{4}-\\d{2}-\\d{2})/?$' => 'index.php?tribe_events_cat=' . $this->rewrite->preg_index(2) . '&post_type=' . TribeEvents::POSTTYPE . '&eventDisplay=day' . '&eventDate=' . $this->rewrite->preg_index(3), $this->tag_base . '([^/]+)/(\\d{4}-\\d{2}-\\d{2})/?$' => 'index.php?tag=' . $this->rewrite->preg_index(2) . '&post_type=' . TribeEvents::POSTTYPE . '&eventDisplay=day' . '&eventDate=' . $this->rewrite->preg_index(3)); return $rules; }
/** * Generates all the rewrite rules for a given post type. * * The rewrite rules allow a post type to be filtered by all possible combinations & permutations * of taxonomies that apply to the specified post type and additional query_vars specified with * the $queryVars parameter. * * Must be called from a function hooked to the 'generate_rewrite_rules' action so that the global * $wpRewrite->preg_index function returns the correct value. * * You have to use pre_get_posts, query_vars filters to add the category/tag rewrites correctly. * See for example ~/kpt-intranet-blog/src/KptIntranetBlog/Theme/Component/UserImageComponent.php * * @param \WP_Rewrite $wpRewrite * @param string|object $postType The post type for which you wish to create the rewrite rules * @param array $queryVars optional Non-taxonomy query vars you wish to create rewrite rules for. Rules will be created to capture any single string for the query_var, that is, a rule of the form '/query_var/(.+)/' * * @author Brent Shepherd <*****@*****.**> * @since 1.0 * @url http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/ */ function generateRewriteRulesForPostType($wpRewrite, $postType, $queryVars = array()) { if (!is_object($postType)) { $postType = get_post_type_object($postType); } $newRewriteRules = array(); $taxonomies = get_object_taxonomies($postType->name, 'objects'); // Add taxonomy filters to the query vars array foreach ($taxonomies as $taxonomy) { if ($taxonomy->query_var == 'category_name' || $taxonomy->query_var == 'post_tag') { $queryVars[] = $taxonomy->rewrite['slug']; } else { $queryVars[] = $taxonomy->query_var; } } // Loop over all the possible combinations of the query vars for ($i = 1; $i <= count($queryVars); $i++) { $newRewriteRule = $postType->rewrite['slug'] . '/'; $newQueryString = 'index.php?post_type=' . $postType->name; // Prepend the rewrites & queries for ($n = 1; $n <= $i; $n++) { $newRewriteRule .= '(' . implode('|', $queryVars) . ')/(.+?)/'; $newQueryString .= '&' . $wpRewrite->preg_index($n * 2 - 1) . '=' . $wpRewrite->preg_index($n * 2); } // Allow paging of filtered post type - WordPress expects 'page' in the URL but uses 'paged' in the query string so paging doesn't fit into our regex $newPagedRewriteRule = $newRewriteRule . 'page/([0-9]{1,})/'; $newPagedQueryString = $newQueryString . '&paged=' . $wpRewrite->preg_index($i * 2 + 1); // Make the trailing backslash optional $newPagedRewriteRule = $newPagedRewriteRule . '?$'; $newRewriteRule = $newRewriteRule . '?$'; // Add the new rewrites $newRewriteRules = array($newPagedRewriteRule => $newPagedQueryString, $newRewriteRule => $newQueryString) + $newRewriteRules; } $wpRewrite->rules = $newRewriteRules + $wpRewrite->rules; }