get_form_data(); echo '
'; echo '

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

'; echo '

' . esc_html__( 'Search code inside active themes 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'] ); } 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, 'submitted' => false, 'error' => '', 'results' => array(), ); 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'] ) ); } $data['scan_plugins'] = isset( $_POST['scan_plugins'] ); $data['scan_themes'] = isset( $_POST['scan_themes'] ); 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['error'] = __( 'Select at least one search location.', 'admin-code-search' ); return $data; } $dirs = array(); if ( $data['scan_plugins'] && defined( '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; } } $extensions = ADCOSE_Helpers::normalize_extensions( $data['exts'] ); $exclude_names = array( 'vendor', 'node_modules', 'wp-content/uploads', 'cache', '.git', '.svn', ); $scanner = new ADCOSE_Scanner(); $data['results'] = $scanner->scan( $dirs, $data['term'], $extensions, $exclude_names ); 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 '

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

'; echo '

'; echo ''; echo '

'; echo '
'; } /** * Render results table. * * @param array $results Search results. * @return void */ private function render_results( $results, $term ) { $total_matches = 0; foreach ( $results as $file => $rows ) { $total_matches += count( $rows ); } echo '

'; echo esc_html__( 'Results', 'admin-code-search' ) . ' '; echo '(' . intval( $total_matches ) . ' ' . esc_html__( 'matches', 'admin-code-search' ) . ' ' . esc_html__( 'in', 'admin-code-search' ) . ' ' . intval( count( $results ) ) . ' ' . esc_html__( 'files', 'admin-code-search' ) . ')'; echo '

'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; foreach ( $results as $file => $rows ) { foreach ( $rows as $row ) { echo ''; echo ''; echo ''; $highlighted = ADCOSE_Helpers::highlight_term( $row['text'], $term ); 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(), ) ) . '
'; } }