_query = $query_object; if ( null === $rewrite_object ) { global $wp_rewrite; $rewrite_object = $wp_rewrite; } $this->_rewrite = $rewrite_object; $this->init_vars(); } /** * Query variable setter/getter * * @param string $name Name of variable to query * @param mixed $value Value to set [optional=null/act as getter] * * @return mixed Variable, null if not present, true in setter mode */ public function variable( $name, $value = null ) { if ( null !== $value ) { $this->_query_vars[$name] = $value; return true; } if ( ! isset( $this->_query_vars[$name] ) ) { return null; } return $this->_query_vars[$name]; } /** * Initiate (populate) query variables list. Two different url structures are supported. * * */ public function init_vars( $query = null ) { foreach ( $_REQUEST as $key => $value ) { $this->variable( $key, $value ); } if ( null === $query ) { $query = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : ''; } $particles = explode( '/', trim( $query, '/' ) ); $imported = 0; foreach ( $particles as $element ) { if ( $this->_add_serialized_var( $element ) ) { ++$imported; } } if ( isset( $_REQUEST['ai1ec'] ) ) { $particles = explode( '|', trim( $_REQUEST['ai1ec'], '|' ) ); foreach ( $particles as $element ) { if ( $this->_add_serialized_var( $element ) ) { ++$imported; } } } return $imported; } /** * Check if rewrite module is enabled */ public function rewrite_enabled() { return $this->_rewrite->using_mod_rewrite_permalinks(); } /** * register_rule method * * Register rewrite rule with framework * * @param string $regexp Expression to register * @param string $landing URL to be executed on match * @param int $priority Numeric rule priority - higher means sooner check * * @return string Regexp rule registered with framework */ public function register_rule( $regexp, $landing, $priority = NULL ) { if ( NULL === $priority ) { $priority = 1; } $priority = ( $priority > 0 ) ? 'top' : 'bottom'; $regexp = $this->_inject_route_groups( $regexp ); $existing = $this->_rewrite->wp_rewrite_rules(); if ( ! isset( $existing[$regexp] ) ) { $this->_rewrite->add_rule( $regexp, $landing, $priority ); $this->_rewrite->flush_rules(); } return $regexp; } /** * Add serialized (key:value) value to query arguments list */ protected function _add_serialized_var( $element ) { if ( false === strpos( $element, Ai1ec_Uri::DIRECTION_SEPARATOR ) ) { return false; } list( $key, $value ) = explode( Ai1ec_Uri::DIRECTION_SEPARATOR, $element, 2 ); $this->variable( $key, $value ); return true; } /** * Adjust regexp groupping identifiers using WP_Rewrite object */ protected function _inject_route_groups( $query ) { $elements = preg_split( '/\$(\d+)/', $query, null, PREG_SPLIT_DELIM_CAPTURE ); $result = ''; foreach ( $elements as $key => $value ) { if ( $key % 2 == 1 ) { $value = $this->_rewrite->preg_index($value); } $result .= $value; } return $result; } }