all-in-one-event-calendar/lib/query/helper.php
2017-11-09 17:36:04 +01:00

172 lines
4.7 KiB
PHP

<?php
/**
* Query helper.
*
* @author Time.ly Network Inc.
* @since 2.0
*
* @package AI1EC
* @subpackage AI1EC.query
*/
class Ai1ec_Query_Helper {
/**
* @var WP_Query Instance of WP_Query object
*/
protected $_query = null;
/**
* @var WP_Rewrite Instance of WP_Rewrite object
*/
protected $_rewrite = null;
/**
* @var array List of parsed query variables
*/
protected $_query_vars = array();
/**
* Initiate object entities
*
* @param object $query_object Instance of query object [optional=WP_Query]
* @param object $rewrite_object Instance of query object [optional=WP_Rewrite]
*
* @return void Constructor does not return
*/
public function __construct(
$query_object = null,
$rewrite_object = null
) {
if ( null === $query_object ) {
global $wp_query;
$query_object = $wp_query;
}
$this->_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;
}
}