wordpress/php-fpm/wordpress_files/plugins/relevanssi/lib/admin-ajax.php

389 lines
11 KiB
PHP
Raw Normal View History

2020-05-22 03:40:23 +02:00
<?php
/**
* /lib/admin-ajax.php
*
* @package Relevanssi
* @author Mikko Saari
* @license https://wordpress.org/about/gpl/ GNU General Public License
* @see https://www.relevanssi.com/
*/
add_action( 'wp_ajax_relevanssi_truncate_index', 'relevanssi_truncate_index_ajax_wrapper' );
add_action( 'wp_ajax_relevanssi_index_posts', 'relevanssi_index_posts_ajax_wrapper' );
add_action( 'wp_ajax_relevanssi_count_posts', 'relevanssi_count_posts_ajax_wrapper' );
add_action( 'wp_ajax_relevanssi_count_missing_posts', 'relevanssi_count_missing_posts_ajax_wrapper' );
add_action( 'wp_ajax_relevanssi_list_categories', 'relevanssi_list_categories' );
add_action( 'wp_ajax_relevanssi_admin_search', 'relevanssi_admin_search' );
/**
* Truncates the Relevanssi index.
*
* Wipes the index clean using relevanssi_truncate_index().
*/
function relevanssi_truncate_index_ajax_wrapper() {
$response = relevanssi_truncate_index();
echo wp_json_encode( $response );
wp_die();
}
/**
* Indexes posts in AJAX context.
*
* AJAX wrapper for indexing posts. Parses the arguments, uses the
* relevanssi_build_index() to do the hard work, then creates the AJAX response.
*/
function relevanssi_index_posts_ajax_wrapper() {
check_ajax_referer( 'relevanssi_indexing_nonce', 'security' );
$completed = absint( $_POST['completed'] );
$total = absint( $_POST['total'] );
$offset = absint( $_POST['offset'] );
$limit = absint( $_POST['limit'] );
$extend = strval( $_POST['extend'] );
if ( 'true' === $extend ) {
$extend = true;
}
if ( $limit < 1 ) {
$limit = 1;
}
$response = array();
$is_ajax = true;
$verbose = false;
if ( $extend ) {
$offset = true;
}
$indexing_response = relevanssi_build_index( $offset, $verbose, $limit, $is_ajax );
if ( $indexing_response['indexing_complete'] ) {
$response['completed'] = 'done';
$response['percentage'] = 100;
$completed += $indexing_response['indexed'];
$response['total_posts'] = $completed;
$processed = $total;
} else {
$completed += $indexing_response['indexed'];
$response['completed'] = $completed;
if ( true === $offset ) {
$processed = $completed;
} else {
$offset = $offset + $limit;
$processed = $offset;
}
if ( $total > 0 ) {
$response['percentage'] = $processed / $total * 100;
} else {
$response['percentage'] = 0;
}
}
$response['feedback'] = sprintf(
// translators: Number of posts indexed on this go, total number of posts indexed so far, number of posts processed on this go, total number of posts to process.
_n(
'Indexed %1$d post (total %2$d), processed %3$d / %4$d.',
'Indexed %1$d posts (total %2$d), processed %3$d / %4$d.',
$indexing_response['indexed'],
'relevanssi'
),
$indexing_response['indexed'],
$completed,
$processed,
$total
) . "\n";
$response['offset'] = $offset;
echo wp_json_encode( $response );
wp_die();
}
/**
* Counts the posts to index.
*
* AJAX wrapper for relevanssi_count_total_posts().
*/
function relevanssi_count_posts_ajax_wrapper() {
$count = relevanssi_count_total_posts();
echo wp_json_encode( $count );
wp_die();
}
/**
* Counts the posts missing from the index.
*
* AJAX wrapper for relevanssi_count_missing_posts().
*/
function relevanssi_count_missing_posts_ajax_wrapper() {
$count = relevanssi_count_missing_posts();
echo wp_json_encode( $count );
wp_die();
}
/**
* Lists categories.
*
* AJAX wrapper for get_categories().
*/
function relevanssi_list_categories() {
$categories = get_categories(
array(
'taxonomy' => 'category',
'hide_empty' => false,
)
);
echo wp_json_encode( $categories );
wp_die();
}
/**
* Performs an admin search.
*
* Performs an admin dashboard search.
*
* @since 2.2.0
*/
function relevanssi_admin_search() {
check_ajax_referer( 'relevanssi_admin_search_nonce', 'security' );
$args = array();
if ( isset( $_POST['args'] ) ) {
parse_str( $_POST['args'], $args );
}
if ( isset( $_POST['posts_per_page'] ) ) {
$posts_per_page = intval( $_POST['posts_per_page'] );
if ( $posts_per_page > 0 ) {
$args['posts_per_page'] = $posts_per_page;
}
}
if ( isset( $_POST['post_types'] ) ) {
$post_type = $_POST['post_types'];
$args['post_types'] = $post_type;
}
if ( isset( $_POST['offset'] ) ) {
$offset = intval( $_POST['offset'] );
if ( $offset > 0 ) {
$args['offset'] = $offset;
}
}
if ( isset( $_POST['s'] ) ) {
$args['s'] = $_POST['s'];
}
$query = new WP_Query();
$query->parse_query( $args );
$query->set( 'relevanssi_admin_search', true );
$query = apply_filters( 'relevanssi_modify_wp_query', $query );
relevanssi_do_query( $query );
$results = relevanssi_admin_search_debugging_info( $query );
// Take the posts array and create a string out of it.
$offset = 0;
if ( isset( $query->query_vars['offset'] ) ) {
$offset = $query->query_vars['offset'];
}
$results .= relevanssi_admin_search_format_posts( $query->posts, $query->found_posts, $offset, $args['s'] );
echo wp_json_encode( $results );
wp_die();
}
/**
* Formats the posts for admin search.
*
* Results are presented as an ordered list of posts. The format is very basic, and
* can be modified with the 'relevanssi_admin_search_element' filter hook.
*
* @param array $posts The posts array.
* @param int $total The number of posts found in total.
* @param int $offset Offset value.
* @param string $query The search query.
*
* @return string The formatted posts.
*
* @since 2.2.0
*/
function relevanssi_admin_search_format_posts( $posts, $total, $offset, $query ) {
$result = '<h3>' . __( 'Results', 'relevanssi' ) . '</h3>';
$start = $offset + 1;
$end = $offset + count( $posts );
// Translators: %1$d is the total number of posts found, %2$d is the current search result count, %3$d is the offset.
$result .= '<p>' . sprintf( __( 'Found a total of %1$d posts, showing posts %2$d%3$s.', 'relevanssi' ), $total, $start, '<span id="offset">' . $end . '</span>' ) . '</p>';
if ( $offset > 0 ) {
$result .= sprintf( '<button type="button" id="prev_page">%s</button>', __( 'Previous page', 'relevanssi' ) );
}
if ( count( $posts ) + $offset < $total ) {
$result .= sprintf( '<button type="button" id="next_page">%s</button>', __( 'Next page', 'relevanssi' ) );
}
$result .= '<ol start="' . $start . '">';
$score_label = __( 'Score:', 'relevanssi' );
foreach ( $posts as $post ) {
$blog_name = '';
if ( isset( $post->blog_id ) ) {
switch_to_blog( $post->blog_id );
$blog_name = get_bloginfo( 'name' ) . ': ';
}
$permalink = get_permalink( $post->ID );
$edit_url = get_edit_post_link( $post->ID );
$post_type = $post->post_type;
if ( isset( $post->relevanssi_link ) ) {
$permalink = $post->relevanssi_link;
}
if ( 'user' === $post->post_type ) {
$edit_url = get_edit_user_link( $post->ID );
}
if ( empty( $edit_url ) ) {
if ( isset( $post->term_id ) ) {
$edit_url = get_edit_term_link( $post->term_id, $post->post_type );
}
}
$title = sprintf( '<a href="%1$s">%2$s %3$s</a>', $permalink, $post->post_title, $post_type );
$edit_link = '';
if ( current_user_can( 'edit_post', $post->ID ) ) {
$edit_link = sprintf( '(<a href="%1$s">%2$s %3$s</a>)', $edit_url, __( 'Edit', 'relevanssi' ), $post_type );
}
$pinning_buttons = '';
$pinned = '';
if ( function_exists( 'relevanssi_admin_search_pinning' ) ) {
// Relevanssi Premium adds pinning features to the admin search.
list( $pinning_buttons, $pinned ) = relevanssi_admin_search_pinning( $post, $query );
}
$post_element = <<<EOH
<li>$blog_name <strong>$title</strong> $edit_link $pinning_buttons <br />
$post->post_excerpt<br />
$score_label $post->relevance_score $pinned</li>
EOH;
/**
* Filters the admin search results element.
*
* The post element is a <li> element. Feel free to edit the element any way you want to.
*
* @param string $post_element The post element.
*/
$result .= apply_filters( 'relevanssi_admin_search_element', $post_element );
if ( isset( $post->blog_id ) ) {
restore_current_blog();
}
}
$result .= '</ol>';
return $result;
}
/**
* Shows debugging information about the search.
*
* Formats the WP_Query parameters, looks at some filter hooks and presents the
* information in an easy-to-read format.
*
* @param array $query The WP_Query object.
*
* @return string The formatted debugging information.
*
* @since 2.2.0
*/
function relevanssi_admin_search_debugging_info( $query ) {
$result = '<div id="debugging">';
$result .= '<h3>' . __( 'Query variables', 'relevanssi' ) . '</h3>';
$result .= '<ul style="list-style: disc; margin-left: 1.5em">';
foreach ( $query->query_vars as $key => $value ) {
if ( 'tax_query' === $key ) {
$result .= '<li>tax_query:<ul style="list-style: disc; margin-left: 1.5em">';
$result .= implode(
'',
array_map(
function ( $row ) {
$result = '';
if ( is_array( $row ) ) {
foreach ( $row as $row_key => $row_value ) {
$result .= "<li>$row_key: $row_value</li>";
}
}
return $result;
},
$value
)
);
$result .= '</ul></li>';
} else {
if ( is_array( $value ) ) {
$value = relevanssi_flatten_array( $value );
}
if ( empty( $value ) ) {
continue;
}
$result .= "<li>$key: $value</li>";
}
}
if ( ! empty( $query->tax_query ) ) {
$result .= '<li>tax_query:<ul style="list-style: disc; margin-left: 1.5em">';
foreach ( $query->tax_query as $tax_query ) {
if ( ! is_array( $tax_query ) ) {
continue;
}
foreach ( $tax_query as $key => $value ) {
if ( is_array( $value ) ) {
$value = relevanssi_flatten_array( $value );
}
$result .= "<li>$key: $value</li>";
}
}
$result .= '</ul></li>';
}
$result .= '</ul>';
global $wp_filter;
$filters = array(
'relevanssi_search_ok',
'relevanssi_modify_wp_query',
'relevanssi_search_filters',
'relevanssi_where',
'relevanssi_join',
'relevanssi_fuzzy_query',
'relevanssi_exact_match_bonus',
'relevanssi_query_filter',
'relevanssi_match',
'relevanssi_post_ok',
'relevanssi_search_again',
'relevanssi_results',
'relevanssi_orderby',
'relevanssi_order',
'relevanssi_default_tax_query_relation',
'relevanssi_hits_filter',
);
$result .= '<h3>' . __( 'Filters', 'relevanssi' ) . '</h3>';
$result .= '<button type="button" id="show_filters">' . __( 'show', 'relevanssi' ) . '</button>';
$result .= '<button type="button" id="hide_filters" style="display: none">' . __( 'hide', 'relevanssi' ) . '</button>';
$result .= '<div id="relevanssi_filter_list">';
foreach ( $filters as $filter ) {
if ( isset( $wp_filter[ $filter ] ) ) {
$result .= '<h4>' . $filter . '</h4>';
$result .= '<ul style="list-style: disc; margin-left: 1.5em">';
foreach ( $wp_filter[ $filter ] as $priority => $functions ) {
foreach ( $functions as $function ) {
if ( $function['function'] instanceof Closure ) {
$function['function'] = 'Anonymous function';
}
$result .= "<li>$priority: " . $function['function'] . '</li>';
}
}
$result .= '</ul>';
}
}
$result .= '</div>';
$result .= '</div>';
return $result;
}