upskill-event-manager/wordpress-dev/wordpress/wp-content/plugins/breeze/inc/class-breeze-query-strings-rules.php
bengizmo d1509b3d60 feat(dev-env): implement backup-based development workflow
This commit introduces a more reliable and consistent approach to setting up
the development environment using backups:

- Add setup-from-backup.sh script for environment setup from existing backups
- Standardize script naming and organization
- Move obsolete scripts to bin/obsolete directory
- Update documentation with new workflow instructions
- Create migration guide for transitioning to new workflow
- Update Memory Bank with workflow improvements

The new workflow provides:
- More reliable environment setup
- Faster setup process
- Offline development capability
- Consistent development environments across team members

Breaking changes:
- setup-dev.sh is replaced by setup-from-backup.sh
- sync-and-setup.sh is replaced by separate scripts
- verify-with-wpcli.sh is no longer used

Migration path is documented in MIGRATION_GUIDE.md
2025-03-26 11:26:18 -03:00

400 lines
12 KiB
PHP

<?php
class Breeze_Query_Strings_Rules {
/**
* List of permanently ignored query vars.
*
* @var string[]
*/
public $ignored_list = array(
'utm_source',
'utm_medium',
'utm_campaign',
'utm_expid',
'utm_term',
'utm_content',
'mtm_source',
'mtm_medium',
'mtm_campaign',
'mtm_keyword',
'mtm_cid',
'mtm_content',
'pk_source',
'pk_medium',
'pk_campaign',
'pk_keyword',
'pk_cid',
'pk_content',
'fb_action_ids',
'fb_action_types',
'fb_source',
'fbclid',
'campaignid',
'adgroupid',
'adid',
'gclid',
'age-verified',
'ao_noptimize',
'usqp',
'cn-reloaded',
'_ga',
'sscid',
'gclsrc',
'_gl',
'mc_cid',
'mc_eid',
'_bta_tid',
'_bta_c',
'trk_contact',
'trk_msg',
'trk_module',
'trk_sid',
'gdfms',
'gdftrk',
'gdffi',
'_ke',
'redirect_log_mongo_id',
'redirect_mongo_id',
'sb_referer_host',
'mkwid',
'pcrid',
'ef_id',
's_kwcid',
'msclkid',
'dm_i',
'epik',
'pp',
);
/**
* List of always cacheable query vars.
*
* @var string[]
*/
public $always_cache_query = array(
'lang',
'permalink_name',
'lp-variation-id',
);
// Hold the class instance.
private static $instance = null;
function __construct() {
// Include necessary helper functions.
require_once $this->trailingslashit( dirname( __FILE__ ) ) . '/helpers.php';
}
public static function get_instance() {
if ( self::$instance == null ) {
self::$instance = new Breeze_Query_Strings_Rules();
}
return self::$instance;
}
/**
* Appends a trailing slash.
* @param $value the path.
* @return string path with a trailing slash added.
*/
public function trailingslashit( $value ) {
return rtrim( $value, '/\\' ) . '/';
}
public function fetch_ignored_list() {
$this->ignored_list = apply_filters( 'breeze_ignored_query_strings_list', $this->ignored_list );
return $this->ignored_list;
}
public static function when_woocommerce_settings_save() {
if ( isset( $_POST['save'] ) && isset( $_POST['woocommerce_default_customer_address'] ) ) {
Breeze_ConfigCache::factory()->write_config_cache();
}
}
public function fetch_always_cache_list() {
$this->always_cache_query = apply_filters( 'breeze_always_cache_query_strings', $this->always_cache_query );
// woocommerce_geolocation_ajax
if ( isset( $GLOBALS['breeze_config']['woocommerce_geolocation_ajax_inherit'] ) && ! empty( $GLOBALS['breeze_config']['woocommerce_geolocation_ajax_inherit'] ) ) {
$sub_blog_id = $GLOBALS['breeze_config']['blog_id'];
if (
isset( $GLOBALS['breeze_config']['woocommerce_geolocation_ajax_inherit'][ 'subsite_' . $sub_blog_id ] )
&&
1 === (int) $GLOBALS['breeze_config']['woocommerce_geolocation_ajax_inherit'][ 'subsite_' . $sub_blog_id ]
) {
$this->always_cache_query[] = 'v';
}
} elseif ( isset( $GLOBALS['breeze_config']['woocommerce_geolocation_ajax'] ) && 1 === (int) $GLOBALS['breeze_config']['woocommerce_geolocation_ajax'] ) {
$this->always_cache_query[] = 'v';
}
if ( isset( $GLOBALS['breeze_config'] ) && isset( $GLOBALS['breeze_config']['permalink_structure'] ) ) {
$get_permalink_structure = $GLOBALS['breeze_config']['permalink_structure'];
if ( is_array( $get_permalink_structure ) ) {
// since it's using the default breeze-config.
$this->always_cache_query[] = 'p';
$this->always_cache_query[] = 'page_id';
$this->always_cache_query[] = 'postname';
$this->always_cache_query[] = 'cat';
$this->always_cache_query[] = 'attachment_id';
$this->always_cache_query[] = 'author';
$this->always_cache_query[] = 'author_name';
$this->always_cache_query[] = 'calendar';
$this->always_cache_query[] = 'second';
$this->always_cache_query[] = 'minute';
$this->always_cache_query[] = 'hour';
$this->always_cache_query[] = 'day';
$this->always_cache_query[] = 'monthnum';
$this->always_cache_query[] = 'year';
$this->always_cache_query[] = 'page';
$this->always_cache_query[] = 'paged';
$this->always_cache_query[] = 'category';
$this->always_cache_query[] = 'taxonomy';
$this->always_cache_query[] = 'tag';
$this->always_cache_query[] = 'tag_id';
$this->always_cache_query[] = 'withcomments';
$this->always_cache_query[] = 'withoutcomments';
$this->always_cache_query[] = 'm';
} else {
if ( empty( trim( $get_permalink_structure ) ) ) {
$this->always_cache_query[] = 'p';
$this->always_cache_query[] = 'page_id';
$this->always_cache_query[] = 'postname';
$this->always_cache_query[] = 'cat';
$this->always_cache_query[] = 'attachment_id';
$this->always_cache_query[] = 'author';
$this->always_cache_query[] = 'author_name';
$this->always_cache_query[] = 'calendar';
$this->always_cache_query[] = 'second';
$this->always_cache_query[] = 'minute';
$this->always_cache_query[] = 'hour';
$this->always_cache_query[] = 'day';
$this->always_cache_query[] = 'monthnum';
$this->always_cache_query[] = 'year';
$this->always_cache_query[] = 'page';
$this->always_cache_query[] = 'paged';
$this->always_cache_query[] = 'category';
$this->always_cache_query[] = 'taxonomy';
$this->always_cache_query[] = 'tag';
$this->always_cache_query[] = 'tag_id';
$this->always_cache_query[] = 'withcomments';
$this->always_cache_query[] = 'withoutcomments';
$this->always_cache_query[] = 'm';
}
}
}
return $this->always_cache_query;
}
/**
* Validates if a link containing query string(s) should be cached or not.
*
* @return bool
* @since 1.2.4
*/
function breeze_is_query_string_ignore() {
$always_cache_query = $this->fetch_always_cache_list();
$current_url_query = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_QUERY );
parse_str( $current_url_query, $breeze_query_output );
if ( 'GET' === $_SERVER['REQUEST_METHOD'] && ! empty( $current_url_query ) ) {
$cache_page = true;
// If the URL contains query string that needs caching.
foreach ( $always_cache_query as $query_string ) {
if ( array_key_exists( $query_string, $breeze_query_output ) ) {
$cache_page = false;
break;
}
}
if ( false === $cache_page ) {
return false;
}
// IF user defines query strings that can be cached.
if (
isset( $GLOBALS['breeze_config'], $GLOBALS['breeze_config']['cached-query-strings'] ) &&
! empty( $GLOBALS['breeze_config']['cached-query-strings'] ) &&
is_array( $GLOBALS['breeze_config']['cached-query-strings'] )
) {
foreach ( $GLOBALS['breeze_config']['cached-query-strings'] as $query_string ) {
if ( array_key_exists( $query_string, $breeze_query_output ) ) {
$cache_page = false;
break;
}
}
if ( false === $cache_page ) {
return false;
}
}
return true;
}
return false;
}
/**
* Checks if the current URL contains ignored query strings.
*
* @param string $url Current URL.
*
* @return bool
*/
public function breeze_ignored_query_strings( $url = '' ) {
if ( empty( trim( $url ) ) ) {
$url = $_SERVER['REQUEST_URI'];
}
if ( 'GET' !== $_SERVER['REQUEST_METHOD'] ) {
return false;
}
$ignored_list = $this->fetch_ignored_list();
$current_url_query = parse_url( $url, PHP_URL_QUERY );
parse_str( $current_url_query, $breeze_query_output );
$found_index = false;
foreach ( $breeze_query_output as $index => $value ) {
$index = mb_strtolower( trim( $index ) );
if ( in_array( $index, $ignored_list, true ) ) {
$found_index = true;
break;
}
}
return $found_index;
}
public function extract_query_strings( $url = '' ) {
if ( empty( trim( $url ) ) ) {
$url = $_SERVER['REQUEST_URI'];
}
$current_url_query = parse_url( $url, PHP_URL_QUERY );
if ( ! empty( $current_url_query ) ) {
parse_str( $current_url_query, $breeze_query_output );
}
if ( empty( $breeze_query_output ) ) {
$breeze_query_output = array();
}
return $breeze_query_output;
}
public function check_query_var_group( $current_url = '' ) {
if ( empty( trim( $current_url ) ) ) {
$current_url = $_SERVER['REQUEST_URI'];
}
$found_items = array(
'ignored_no' => 0, // how many vars from ignore list are found.
'ignored_items' => array(), // which items were found in ignore list.
'cached_no' => 0, // query vars that need to be cached.
'cached_items' => array(), // which items were found in to cache list.
'user_cached_no' => 0, // query vars that need to be cached, these are defined by the user in back-end.
'user_cached_items' => array(), // which items were found in to cache list, these are defined by the user in back-end.
'extra_query_no' => 0, // number of query vars not found in any list.
'extra_query_vars' => array(), // list of query vars not found in any list.
);
// Only process links if the request is GET.
if ( ( isset( $_SERVER['REQUEST_METHOD'] ) && 'GET' !== $_SERVER['REQUEST_METHOD'] ) || empty( $current_url ) ) {
return $found_items;
}
$ignored_query_vars = $this->fetch_ignored_list();
$to_cache_query_vars = $this->fetch_always_cache_list();
$user_defined_query_vars = array();
// Current URL query strings ( vars ).
$extracted_vars = $this->extract_query_strings( $current_url );
// Query strings that are not found anywhere.
$not_found_anywhere = $extracted_vars;
if (
isset( $GLOBALS['breeze_config'], $GLOBALS['breeze_config']['cached-query-strings'] ) &&
! empty( $GLOBALS['breeze_config']['cached-query-strings'] ) &&
is_array( $GLOBALS['breeze_config']['cached-query-strings'] )
) {
$user_defined_query_vars = $GLOBALS['breeze_config']['cached-query-strings'];
if ( is_array( $user_defined_query_vars ) ) {
foreach ( $user_defined_query_vars as $index => $value ) {
if ( 's' === $value ) {
unset( $user_defined_query_vars[ $index ] );
}
}
}
}
foreach ( $extracted_vars as $index => $value ) {
// Fetch all the query vars that are in the ignore list and found in current URL.
if ( in_array( $index, $ignored_query_vars, true ) ) {
$found_items['ignored_no'] ++;
$found_items['ignored_items'][ $index ] = $value;
unset( $not_found_anywhere[ $index ] );
}
// Fetch all the query vars that are in the must cache list and found in current URL.
if ( in_array( $index, $to_cache_query_vars, true ) ) {
$found_items['cached_no'] ++;
$found_items['cached_items'][ $index ] = $value;
unset( $not_found_anywhere[ $index ] );
}
// Fetch all the query vars that are in the must cache list and found in current URL, user defined.
if (
in_array( $index, $user_defined_query_vars, true )
|| ! empty( breeze_is_string_in_array_values( $index, $user_defined_query_vars ) )
) {
$found_items['user_cached_no'] ++;
$found_items['user_cached_items'][ $index ] = $value;
unset( $not_found_anywhere[ $index ] );
}
}
$found_items['extra_query_no'] = count( $not_found_anywhere );
$found_items['extra_query_vars'] = $not_found_anywhere;
return $found_items;
}
/**
* Rebuild the URL without the ignored query strings.
*/
public function rebuild_url( $url = '', $query_vars = array() ) {
// if there are any query vars not found in any lists, we send the same link back.
// This URL will not be cached.
if ( 0 !== (int) $query_vars['extra_query_no'] ) {
return $url;
}
if ( false !== strpos( $url, '?' ) ) {
$e = explode( '?', $url );
$result = array_merge( $query_vars['cached_items'], $query_vars['user_cached_items'] );
$url = rtrim( $e[0], '/\\' ) . '/' . ( ( ! empty( $result ) ) ? '?' . http_build_query( $result ) : '' );
}
return $url;
}
}
new Breeze_Query_Strings_Rules();