AnsPress_Rewrite()
Description #
This class handle all rewrite rules and define query variable of anspress
Source #
File: includes/rewrite.php
class AnsPress_Rewrite { /** * Internal increment. * * @var int */ private static $counter = 1; /** * Filter global request array. * * @param array $request Request array. * @return array * @since 4.1.0 */ public static function alter_the_query( $request ) { if ( isset( $request['post_type'] ) && 'answer' === $request['post_type'] ) { if ( ! empty( $request['feed'] ) ) { unset( $request['question_id'] ); unset( $request['answer'] ); } if ( isset( $request['embed'] ) && 'true' === $request['embed'] ) { $request['p'] = $request['answer_id']; } } return $request; } /** * Register query vars * * @param array $query_vars Registered query variables. * @return array * * @since 4.1.11 Fixed 'answer_id' is inserted twice. */ public static function query_var( $query_vars ) { $query_vars[] = 'edit_post_id'; $query_vars[] = 'ap_nonce'; $query_vars[] = 'question_id'; $query_vars[] = 'answer_id'; $query_vars[] = 'answer'; $query_vars[] = 'ask'; $query_vars[] = 'ap_page'; $query_vars[] = 'qcat_id'; $query_vars[] = 'qcat'; $query_vars[] = 'qtag_id'; $query_vars[] = 'q_tag'; $query_vars[] = 'ap_s'; $query_vars[] = 'parent'; $query_vars[] = 'ap_user'; $query_vars[] = 'user_page'; $query_vars[] = 'ap_paged'; return $query_vars; } /** * Generate rewrite rules for AnsPress. * * @return void * @since 4.1.0 */ public static function rewrite_rules() { global $wp_rewrite; $q_struct = AnsPress_PostTypes::question_perm_structure(); $rules = $wp_rewrite->generate_rewrite_rules( $q_struct->rule, EP_NONE, false, false, true ); $rule = key( $rules ); anspress()->question_rule = array( 'rule' => substr( $rule, 0, -3 ), 'rewrite' => reset( $rules ), ); } /** * Rewrite rules. * * @return array */ public static function rewrites() { global $wp_rewrite; $rule = anspress()->question_rule['rule']; $rewrite = anspress()->question_rule['rewrite']; $all_rules = array(); $base_page_id = ap_opt( 'base_page' ); $slug_main = ap_base_page_slug(); $lang_rule = ''; $lang_rewrite = ''; // Support polylang permalink. if ( function_exists( 'pll_languages_list' ) ) { if ( ! empty( pll_languages_list() ) ) { $lang_rule = '(' . implode( '|', pll_languages_list() ) . ')/'; $lang_rewrite = '&lang=$matches[#]'; } } $slug = $lang_rule . $slug_main . '/'; $base_page_id = $base_page_id . $lang_rewrite; $answer_rewrite = str_replace( 'post_type=question', 'post_type=answer', $rewrite ); $answer_rewrite = str_replace( '&question=', '&question_slug=', $answer_rewrite ); $answer_rewrite = str_replace( '&p=', '&question_id=', $answer_rewrite ); $all_rules = array( $slug . 'search/([^/]+)/page/?([0-9]{1,})/?$' => 'index.php?s=$matches[#]&paged=$matches[#]&post_type=question', $slug . 'search/([^/]+)/?$' => 'index.php?s=$matches[#]&post_type=question', $slug . 'edit/?$' => 'index.php?pagename=' . $slug_main . '&ap_page=edit', $lang_rule . $rule . '/answer/([0-9]+)/(feed|rdf|rss|rss2|atom)/?$' => $lang_rewrite . $answer_rewrite . '&answer_id=$matches[#]&feed=$matches[#]', $lang_rule . $rule . '/answer/([0-9]+)/embed/?$' => $lang_rewrite . $answer_rewrite . '&answer_id=$matches[#]&embed=true', $lang_rule . $rule . '/answer/([0-9]+)/?$' => $lang_rewrite . $rewrite . '&answer_id=$matches[#]', $lang_rule . $rule . '/page/?([0-9]{1,})/?$' => $lang_rewrite . $rewrite . '&ap_paged=$matches[#]', $lang_rule . $rule . '/(feed|rdf|rss|rss2|atom)/?$' => $lang_rewrite . $rewrite . '&feed=$matches[#]', $lang_rule . $rule . '/embed/?$' => $lang_rewrite . $rewrite . '&embed=true', $lang_rule . $rule . '/?$' => $lang_rewrite . $rewrite, ); /** * Allows filtering AnsPress rewrite rules. * * @param array $all_rules Rewrite rules. * @since 4.1.0 */ $all_rules = apply_filters( 'ap_rewrites', $all_rules, $slug, $base_page_id ); $ap_rules = array(); foreach ( $all_rules as $r => $re ) { $re = preg_replace( '/\\$([1-9]+)/', '$matches[#]', $re ); $re = preg_replace_callback( '/\#/', array( __CLASS__, 'incr_hash' ), $re ); $ap_rules[ $r ] = $re; self::$counter = 1; } $front = ltrim( $wp_rewrite->front, '/' ); $wp_rewrite->rules = ap_array_insert_after( $wp_rewrite->rules, $front . 'type/([^/]+)/?$', $ap_rules ); return $wp_rewrite->rules; } /** * Increment hash. * * @param array $matches Matches. */ public static function incr_hash( $matches ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found return self::$counter++; } /** * BuddyPress pagination fix. * * @param array $args Arguments. * @return array * * @deprecated 4.4.0 */ public static function bp_com_paged( $args ) { _deprecated_function( __METHOD__, '4.4.0', 'AnsPress_Rewrite::pagination_fix()' ); return self::pagination_fix( $args ); } /** * Pagination fix. * * @param array $args Arguments. * @return array */ public static function pagination_fix( $args ) { /** * Home page pagination fix, * when the questions are directly used within the loop, * i.e., without setting the static front page. * * @param array $args Arguments. * @return array */ if ( is_front_page() && is_home() ) { return preg_replace( '/page.([0-9]+).*/', '?page=$1', $args ); } /** * BuddyPress pagination fix. */ if ( function_exists( 'bp_current_component' ) ) { $bp_com = bp_current_component(); if ( 'questions' === $bp_com || 'answers' === $bp_com ) { return preg_replace( '/page.([0-9]+)./', '?paged=$1', $args ); } } return $args; } /** * Push custom query args in `$wp`. * * @param object $wp WP query object. */ public static function add_query_var( $wp ) { if ( ! empty( $wp->query_vars['ap_user'] ) ) { $user = get_user_by( 'login', sanitize_text_field( urldecode( $wp->query_vars['ap_user'] ) ) ); if ( $user ) { $wp->set_query_var( 'ap_user_id', (int) $user->ID ); } else { global $wp_query; $wp_query->set_404(); status_header( 404 ); get_template_part( 404 ); exit(); } } } /** * Handles shortlink redirects. * * @since unknown * @since 4.1.6 Fixed: question and answer links are redirected to home. */ public static function shortlink() { global $wp_query; $page = get_query_var( 'ap_page' ); if ( empty( $page ) || 'shortlink' !== $page ) { return; } $post_id = ap_isset_post_value( 'ap_q', ap_isset_post_value( 'ap_a', false ) ); $post_id = ap_isset_post_value( 'ap_p', $post_id ); // Post redirect. if ( $post_id ) { $permalink = get_permalink( $post_id ); wp_redirect( $permalink, 302 ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect exit; } // Comment redirect. if ( ap_isset_post_value( 'ap_c', false ) ) { $permalink = get_comment_link( ap_isset_post_value( 'ap_c' ) ); wp_redirect( $permalink, 302 ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect exit; } // User redirect. if ( ap_isset_post_value( 'ap_u', false ) ) { $permalink = ap_user_link( ap_isset_post_value( 'ap_u' ), ap_isset_post_value( 'sub' ) ); wp_redirect( $permalink, 302 ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect exit; } } }
Expand full source code Collapse full source code View on GitHub: includes/rewrite.php:22
Add your comment