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