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
		
			
				
	
	
		
			237 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Contains the query functions for UserRegistration which alter the front-end post queries and loops
 | |
|  *
 | |
|  * @version 1.0.0
 | |
|  * @package UserRegistration\Classes
 | |
|  */
 | |
| 
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * UR_Query Class.
 | |
|  */
 | |
| class UR_Query {
 | |
| 
 | |
| 	/**
 | |
| 	 * Query vars to add to wp.
 | |
| 	 *
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	public $query_vars = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor for the query class. Hooks in methods.
 | |
| 	 */
 | |
| 	public function __construct() {
 | |
| 		add_action( 'init', array( $this, 'add_endpoints' ) );
 | |
| 		if ( ! is_admin() ) {
 | |
| 			add_action( 'wp_loaded', array( $this, 'get_errors' ), 20 );
 | |
| 			add_filter( 'query_vars', array( $this, 'add_query_vars' ), 0 );
 | |
| 			add_action( 'parse_request', array( $this, 'parse_request' ), 0 );
 | |
| 			add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
 | |
| 			add_action( 'wp', array( $this, 'remove_post_query' ) );
 | |
| 		}
 | |
| 		$this->init_query_vars();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get any errors from querystring.
 | |
| 	 */
 | |
| 	public function get_errors() {
 | |
| 		$error = ! empty( $_GET['ur_error'] ) ? sanitize_text_field( wp_unslash( $_GET['ur_error'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
 | |
| 
 | |
| 		if ( $error && ! ur_has_notice( $error, 'error' ) ) {
 | |
| 			ur_add_notice( $error, 'error' );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Init query vars by loading options.
 | |
| 	 */
 | |
| 	public function init_query_vars() {
 | |
| 		// Query vars to add to WP.
 | |
| 		$this->query_vars = array(
 | |
| 			// My account actions.
 | |
| 			'edit-password'    => get_option( 'user_registration_myaccount_change_password_endpoint', 'edit-password' ),
 | |
| 			'edit-profile'     => get_option( 'user_registration_myaccount_edit_profile_endpoint', 'edit-profile' ),
 | |
| 			'ur-lost-password' => get_option( 'user_registration_myaccount_lost_password_endpoint', 'lost-password' ),
 | |
| 			'user-logout'      => get_option( 'user_registration_logout_endpoint', 'user-logout' ),
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get page title for an endpoint.
 | |
| 	 *
 | |
| 	 * @param  string $endpoint Endpoint key.
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function get_endpoint_title( $endpoint ) {
 | |
| 		switch ( $endpoint ) {
 | |
| 			case 'edit-password':
 | |
| 				$title = __( 'Change Password', 'user-registration' );
 | |
| 				break;
 | |
| 			case 'edit-profile':
 | |
| 				$title = __( 'Profile Details', 'user-registration' );
 | |
| 				break;
 | |
| 			case 'ur-lost-password':
 | |
| 				$title = __( 'Lost password', 'user-registration' );
 | |
| 				break;
 | |
| 			default:
 | |
| 				$title = '';
 | |
| 				break;
 | |
| 		}
 | |
| 		/**
 | |
| 		 * Applies filter to modify the endpoint title.
 | |
| 		 *
 | |
| 		 * @param string $title The endpoint title.
 | |
| 		 * @param string $endpoint The endpoint.
 | |
| 		 */
 | |
| 		return apply_filters( 'user_registration_endpoint_' . $endpoint . '_title', $title, $endpoint );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Endpoint mask describing the places the endpoint should be added.
 | |
| 	 *
 | |
| 	 * @return int
 | |
| 	 */
 | |
| 	public function get_endpoints_mask() {
 | |
| 		if ( 'page' === get_option( 'show_on_front' ) ) {
 | |
| 			$page_on_front     = get_option( 'page_on_front' );
 | |
| 			$myaccount_page_id = get_option( 'user_registration_myaccount_page_id' );
 | |
| 
 | |
| 			if ( in_array( $page_on_front, array( $myaccount_page_id ), true ) ) {
 | |
| 				return EP_ROOT | EP_PAGES;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return EP_PAGES;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Add endpoints for query vars.
 | |
| 	 */
 | |
| 	public function add_endpoints() {
 | |
| 		$mask = $this->get_endpoints_mask();
 | |
| 
 | |
| 		foreach ( $this->get_query_vars() as $key => $var ) {
 | |
| 			if ( ! empty( $var ) ) {
 | |
| 				add_rewrite_endpoint( $var, $mask );
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Add query vars.
 | |
| 	 *
 | |
| 	 * @param array $vars Query vars.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function add_query_vars( $vars ) {
 | |
| 		foreach ( $this->get_query_vars() as $key => $var ) {
 | |
| 			$vars[] = $key;
 | |
| 		}
 | |
| 
 | |
| 		return $vars;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get query vars.
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function get_query_vars() {
 | |
| 		/**
 | |
| 		 * Applies filter to modify the query vars.
 | |
| 		 *
 | |
| 		 * @param array $this->query_vars List of query vars.
 | |
| 		 */
 | |
| 		return apply_filters( 'user_registration_get_query_vars', $this->query_vars );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get query current active query var.
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	public function get_current_endpoint() {
 | |
| 		global $wp;
 | |
| 
 | |
| 		foreach ( $this->get_query_vars() as $key => $value ) {
 | |
| 			if ( isset( $wp->query_vars[ $key ] ) ) {
 | |
| 				return $key;
 | |
| 			}
 | |
| 		}
 | |
| 		return '';
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Parse the request and look for query vars - endpoints may not be supported.
 | |
| 	 */
 | |
| 	public function parse_request() {
 | |
| 		global $wp;
 | |
| 
 | |
| 		// Map query vars to their keys, or get them if endpoints are not supported.
 | |
| 		foreach ( $this->get_query_vars() as $key => $var ) {
 | |
| 			if ( isset( $_GET[ $var ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
 | |
| 				$wp->query_vars[ $key ] = sanitize_text_field( wp_unslash( $_GET[ $var ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
 | |
| 			} elseif ( isset( $wp->query_vars[ $var ] ) ) {
 | |
| 				$wp->query_vars[ $key ] = $wp->query_vars[ $var ];
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Are we currently on the front page?
 | |
| 	 *
 | |
| 	 * @param WP_Query $q Query instance.
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	private function is_showing_page_on_front( $q ) {
 | |
| 		return $q->is_home() && 'page' === get_option( 'show_on_front' );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Is the front page a page we define?
 | |
| 	 *
 | |
| 	 * @param int $page_id Page ID.
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	private function page_on_front_is( $page_id ) {
 | |
| 		return absint( get_option( 'page_on_front' ) ) === absint( $page_id );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Hook into pre_get_posts to do the main query.
 | |
| 	 *
 | |
| 	 * @param WP_Query $q Query instance.
 | |
| 	 */
 | |
| 	public function pre_get_posts( $q ) {
 | |
| 		// We only want to affect the main query.
 | |
| 		if ( ! $q->is_main_query() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Fix for endpoints on the homepage.
 | |
| 		if ( $this->is_showing_page_on_front( $q ) && ! $this->page_on_front_is( $q->get( 'page_id' ) ) ) {
 | |
| 			$_query = wp_parse_args( $q->query );
 | |
| 			if ( ! empty( $_query ) && array_intersect( array_keys( $_query ), array_keys( $this->query_vars ) ) ) {
 | |
| 				$q->is_page     = true;
 | |
| 				$q->is_home     = false;
 | |
| 				$q->is_singular = true;
 | |
| 				$q->set( 'page_id', (int) get_option( 'page_on_front' ) );
 | |
| 				add_filter( 'redirect_canonical', '__return_false' );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// And remove the pre_get_posts hook.
 | |
| 		$this->remove_post_query();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Remove the query.
 | |
| 	 */
 | |
| 	public function remove_post_query() {
 | |
| 		remove_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
 | |
| 	}
 | |
| }
 |