plugin_name = $plugin_name; $this->version = $version; } /** * Register the stylesheets for the public-facing side of the site. */ public function enqueue_styles() { wp_enqueue_style( $this->plugin_name, MAPLEPRESS_PLUGIN_URL . 'assets/css/maplepress-public.css', array(), $this->version, 'all' ); } /** * Register the JavaScript for the public-facing side of the site. */ public function enqueue_scripts() { wp_enqueue_script( $this->plugin_name, MAPLEPRESS_PLUGIN_URL . 'assets/js/maplepress-public.js', array( 'jquery' ), $this->version, false ); } /** * Intercept WordPress search and use MaplePress search instead. * * @param WP_Query $query The WordPress query object. */ public function intercept_search( $query ) { // Debug logging - detect if this is from CLI test $is_cli_test = isset( $_SERVER['HTTP_X_MAPLEPRESS_TEST'] ); // Log every invocation when WP_DEBUG is on or when it's a CLI test if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( '=== MaplePress intercept_search called ===' ); error_log( 'is_main_query: ' . ( $query->is_main_query() ? 'true' : 'false' ) ); error_log( 'is_search: ' . ( $query->is_search() ? 'true' : 'false' ) ); error_log( 's param: ' . var_export( $query->get( 's' ), true ) ); error_log( 'CLI test header: ' . ( $is_cli_test ? 'true' : 'false' ) ); } // Only intercept main search queries // Check both is_search() and presence of 's' parameter to catch all search scenarios $is_search_query = $query->is_search() || ! empty( $query->get( 's' ) ); if ( ! $query->is_main_query() || ! $is_search_query ) { if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Early return - not main query or not search' ); } return; } // Check if MaplePress is enabled $options = get_option( 'maplepress_settings' ); if ( empty( $options['enabled'] ) || empty( $options['api_url'] ) || empty( $options['api_key'] ) ) { // MaplePress not enabled or configured, use default WordPress search if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Early return - not enabled or not configured' ); error_log( 'enabled: ' . var_export( $options['enabled'] ?? null, true ) ); error_log( 'api_url: ' . var_export( $options['api_url'] ?? null, true ) ); error_log( 'api_key present: ' . ( ! empty( $options['api_key'] ) ? 'yes' : 'no' ) ); } return; } // Check if connection is verified if ( empty( $options['is_verified'] ) ) { if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Early return - connection not verified' ); } return; } // Check if search is enabled for the current context // Speed test queries always proceed regardless of admin/frontend settings if ( ! $is_speed_test ) { $is_admin_area = is_admin(); $frontend_search_enabled = isset( $options['enable_frontend_search'] ) ? $options['enable_frontend_search'] : true; $admin_search_enabled = isset( $options['enable_admin_search'] ) ? $options['enable_admin_search'] : false; // Skip if admin search is not enabled and we're in admin if ( $is_admin_area && ! $admin_search_enabled ) { // In admin but admin search not enabled if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Early return - admin search not enabled' ); } return; } // Skip if frontend search is not enabled and we're on frontend if ( ! $is_admin_area && ! $frontend_search_enabled ) { // On frontend but frontend search not enabled if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Early return - frontend search not enabled' ); } return; } } else { if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Speed test query - bypassing admin/frontend check' ); } } // Get the search query // Try get_search_query() first, then fall back to direct query parameter $search_query = get_search_query(); if ( empty( $search_query ) ) { $search_query = $query->get( 's' ); } if ( empty( $search_query ) ) { if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Early return - empty search query' ); } return; } if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Proceeding with search for: ' . $search_query ); } // Call MaplePress search API require_once MAPLEPRESS_PLUGIN_DIR . 'includes/class-maplepress-api-client.php'; $api_client = new MaplePress_API_Client( $options['api_url'], $options['api_key'] ); $search_args = array( 'limit' => (int) $query->get( 'posts_per_page', 10 ), 'offset' => (int) ( ( $query->get( 'paged', 1 ) - 1 ) * $query->get( 'posts_per_page', 10 ) ), ); if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: Calling API with query: ' . $search_query ); error_log( 'MaplePress: API URL: ' . $options['api_url'] ); error_log( 'MaplePress: Search args: ' . json_encode( $search_args ) ); } $result = $api_client->search( $search_query, $search_args ); if ( is_wp_error( $result ) ) { // API error - fall back to default WordPress search // Log the error for debugging if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { error_log( 'MaplePress search error: ' . $result->get_error_message() ); } if ( $is_cli_test ) { error_log( 'MaplePress search error (CLI test): ' . $result->get_error_message() ); } return; } if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || $is_cli_test ) { error_log( 'MaplePress: API call successful, results: ' . json_encode( $result ) ); } // Extract page IDs from MaplePress results $page_ids = array(); if ( ! empty( $result['hits'] ) ) { foreach ( $result['hits'] as $result_item ) { // Meilisearch returns 'id' field, not 'page_id' if ( ! empty( $result_item['id'] ) ) { $page_ids[] = (int) $result_item['id']; } } } // If no results, show empty results if ( empty( $page_ids ) ) { $query->set( 'post__in', array( 0 ) ); // Force no results } else { // Set query to only return posts matching MaplePress results in the correct order $query->set( 'post__in', $page_ids ); $query->set( 'orderby', 'post__in' ); // Maintain MaplePress result order // In admin context, respect the existing post_type filter (e.g., 'page' when in Pages list) // On frontend, allow any post type if ( ! is_admin() ) { $query->set( 'post_type', 'any' ); // Allow any post type on frontend } // Note: In admin, we preserve whatever post_type was already set by WordPress $query->set( 'post_status', 'publish' ); // Disable the default search query $query->set( 's', '' ); } // Store the original search query for display $query->set( 'maplepress_search_query', $search_query ); // Store total results for pagination if ( ! empty( $result['total_hits'] ) ) { add_filter( 'found_posts', function( $found_posts, $query ) use ( $result ) { if ( $query->get( 'maplepress_search_query' ) ) { return (int) $result['total_hits']; } return $found_posts; }, 10, 2 ); } } /** * Restore the search query for display purposes. * * @param string $search_query The search query. * @return string */ public function restore_search_query( $search_query ) { global $wp_query; $maplepress_query = $wp_query->get( 'maplepress_search_query' ); if ( ! empty( $maplepress_query ) ) { return $maplepress_query; } return $search_query; } }