get_form_data(); echo '
'; echo '

' . esc_html__( 'Code Search', 'admin-code-search' ) . '

'; echo '

' . esc_html__( 'Search code inside active themes, MU plugins, and plugins directly from the WordPress admin area.', 'admin-code-search' ) . '

'; $this->render_form( $data ); if ( ! empty( $data['error'] ) ) { echo '

' . esc_html( $data['error'] ) . '

'; } if ( $data['submitted'] && empty( $data['error'] ) ) { if ( ! empty( $data['results'] ) ) { $this->render_results( $data['results'], $data['term'], $data['summary'], $data['case_sensitive'], $data['match_mode'] ); } else { echo '

' . esc_html__( 'No matches found.', 'admin-code-search' ) . '

'; } } echo '
'; } /** * Prepare submitted form data and run scan if needed. * * @return array */ private function get_form_data() { $data = array( 'term' => '', 'exts' => 'php', 'scan_plugins' => true, 'scan_themes' => true, 'scan_muplugins' => false, 'case_sensitive' => false, 'match_mode' => 'partial', 'submitted' => false, 'error' => '', 'results' => array(), 'summary' => array( 'total_matches' => 0, 'total_files' => 0, 'was_limited' => false, 'result_limit' => ADCOSE_Scanner::MAX_RESULTS, ), ); if ( isset( $_POST['term'] ) ) { $data['term'] = sanitize_text_field( wp_unslash( $_POST['term'] ) ); } if ( isset( $_POST['exts'] ) ) { $data['exts'] = sanitize_text_field( wp_unslash( $_POST['exts'] ) ); } if ( isset( $_POST['match_mode'] ) ) { $match_mode = sanitize_text_field( wp_unslash( $_POST['match_mode'] ) ); $data['match_mode'] = in_array( $match_mode, array( 'partial', 'whole_word', 'exact' ), true ) ? $match_mode : 'partial'; } $data['scan_plugins'] = isset( $_POST['scan_plugins'] ); $data['scan_themes'] = isset( $_POST['scan_themes'] ); $data['scan_muplugins'] = isset( $_POST['scan_muplugins'] ); $data['case_sensitive'] = isset( $_POST['case_sensitive'] ); if ( isset( $_POST['adcose_do_clear'] ) ) { return array( 'term' => '', 'exts' => 'php', 'scan_plugins' => true, 'scan_themes' => true, 'scan_muplugins' => false, 'case_sensitive' => false, 'match_mode' => 'partial', 'submitted' => false, 'error' => '', 'results' => array(), 'summary' => array( 'total_matches' => 0, 'total_files' => 0, 'was_limited' => false, 'result_limit' => ADCOSE_Scanner::MAX_RESULTS, ), ); } if ( ! isset( $_POST['adcose_do_search'] ) ) { return $data; } $data['submitted'] = true; check_admin_referer( 'adcose_search_action', 'adcose_search_nonce' ); if ( '' === trim( $data['term'] ) ) { $data['error'] = __( 'Search term is required.', 'admin-code-search' ); return $data; } if ( ! $data['scan_plugins'] && ! $data['scan_themes'] && ! $data['scan_muplugins'] ) { $data['error'] = __( 'Select at least one search location.', 'admin-code-search' ); return $data; } $dirs = array(); if ( $data['scan_plugins'] && defined( 'WP_PLUGIN_DIR' ) && is_dir( WP_PLUGIN_DIR ) ) { $dirs[] = wp_normalize_path( WP_PLUGIN_DIR ); } if ( $data['scan_themes'] ) { $stylesheet_dir = get_stylesheet_directory(); $template_dir = get_template_directory(); if ( is_dir( $stylesheet_dir ) ) { $dirs[] = $stylesheet_dir; } if ( $template_dir !== $stylesheet_dir && is_dir( $template_dir ) ) { $dirs[] = $template_dir; } } if ( $data['scan_muplugins'] && defined( 'WPMU_PLUGIN_DIR' ) && is_dir( WPMU_PLUGIN_DIR ) ) { $dirs[] = wp_normalize_path( WPMU_PLUGIN_DIR ); } $extensions = ADCOSE_Helpers::normalize_extensions( $data['exts'] ); $exclude_names = array( 'vendor', 'node_modules', 'wp-content/uploads', 'cache', '.git', '.svn', ); $scanner = new ADCOSE_Scanner(); $scan_data = $scanner->scan( $dirs, $data['term'], $extensions, $exclude_names, $data['case_sensitive'], $data['match_mode'] ); $data['results'] = $scan_data['results']; $data['summary'] = $scan_data['summary']; return $data; } /** * Render search form. * * @param array $data Form data. * @return void */ private function render_form( $data ) { echo '
'; wp_nonce_field( 'adcose_search_action', 'adcose_search_nonce' ); echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo '

' . esc_html__( 'Large searches may take time on sites with many plugins or large codebases.', 'admin-code-search' ) . '

'; echo '

'; echo ' '; echo ''; echo '

'; echo '
'; } /** * Render results table. * * @param array $results Search results. * @param string $term Search term. * @param array $summary Search summary. * @param boolean $case_sensitive Whether search is case-sensitive. * @param string $match_mode Match mode. * @return void */ private function render_results( $results, $term, $summary, $case_sensitive, $match_mode ) { echo '

' . esc_html__( 'Results', 'admin-code-search' ) . '

'; echo '

'; echo sprintf( /* translators: 1: total matches, 2: matched files */ esc_html__( '%1$d matches found in %2$d files.', 'admin-code-search' ), intval( $summary['total_matches'] ), intval( $summary['total_files'] ) ); echo '

'; if ( ! empty( $summary['was_limited'] ) ) { echo '

'; echo sprintf( /* translators: %d: maximum number of results shown */ esc_html__( 'Showing first %d matches. Refine your search to narrow results.', 'admin-code-search' ), intval( $summary['result_limit'] ) ); echo '

'; } echo '

'; echo $case_sensitive ? esc_html__( 'Search mode: Case-sensitive.', 'admin-code-search' ) : esc_html__( 'Search mode: Case-insensitive.', 'admin-code-search' ); echo '

'; echo '

'; if ( 'exact' === $match_mode ) { echo esc_html__( 'Match mode: Match entire line exactly.', 'admin-code-search' ); } elseif ( 'whole_word' === $match_mode ) { echo esc_html__( 'Match mode: Whole word match.', 'admin-code-search' ); } else { echo esc_html__( 'Match mode: Partial match.', 'admin-code-search' ); } echo '

'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; foreach ( $results as $file => $rows ) { foreach ( $rows as $row ) { $highlighted = ADCOSE_Helpers::highlight_term( $row['text'], $term ); echo ''; echo ''; echo ''; echo ''; echo ''; } } echo ''; echo '
' . esc_html__( 'File', 'admin-code-search' ) . '' . esc_html__( 'Line', 'admin-code-search' ) . '' . esc_html__( 'Snippet', 'admin-code-search' ) . '
' . esc_html( ADCOSE_Helpers::relative_path( $file ) ) . '' . intval( $row['line'] ) . '' . wp_kses( $highlighted, array( 'mark' => array(), ) ) . '
'; } }