241 lines
7.6 KiB
PHP
241 lines
7.6 KiB
PHP
|
<?php
|
||
|
namespace WpAssetCleanUp;
|
||
|
|
||
|
/**
|
||
|
* Class AjaxSearchAutocomplete
|
||
|
* @package WpAssetCleanUp
|
||
|
*/
|
||
|
class AjaxSearchAutocomplete
|
||
|
{
|
||
|
/**
|
||
|
* AjaxSearchAutocomplete constructor.
|
||
|
*/
|
||
|
public function __construct()
|
||
|
{
|
||
|
add_action('admin_enqueue_scripts', array($this, 'enqueueScripts'));
|
||
|
add_action('wp_ajax_' . WPACU_PLUGIN_ID . '_autocomplete_search', array($this, 'wpAjaxSearch'));
|
||
|
|
||
|
self::maybePreventWpmlPluginFromFiltering();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* "WPML Multilingual CMS" prevents the AJAX loader from "Load assets manager for:" from loading the results as they are
|
||
|
* If a specific ID is put there, the post with that ID should be returned and not one of its translated posts with a different ID
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function maybePreventWpmlPluginFromFiltering()
|
||
|
{
|
||
|
if ( ! (isset($_REQUEST['action'], $_REQUEST['wpacu_term'], $GLOBALS['sitepress']) &&
|
||
|
$_REQUEST['action'] === WPACU_PLUGIN_ID . '_autocomplete_search' &&
|
||
|
$_REQUEST['wpacu_term'] &&
|
||
|
Misc::isPluginActive('sitepress-multilingual-cms/sitepress.php')) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// This is called before "WPML Multilingual CMS" loads as we need to avoid any filtering of the search results
|
||
|
// to avoid confusing the admin when managing the assets within "CSS & JS Manager" -- "Manage CSS/JS"
|
||
|
|
||
|
// Avoid retrieving the wrong (language related) post ID and title
|
||
|
global $sitepress;
|
||
|
remove_action( 'parse_query', array( $sitepress, 'parse_query' ) );
|
||
|
|
||
|
// Avoid retrieving the wrong (language related) permalink
|
||
|
global $wp_filter;
|
||
|
|
||
|
if ( ! isset( $wp_filter['page_link']->callbacks ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
foreach ( $wp_filter['page_link']->callbacks as $key => $values ) {
|
||
|
if ( ! empty( $wp_filter['page_link']->callbacks ) ) {
|
||
|
foreach ( $values as $values2 ) {
|
||
|
if ( isset( $values2['function'][0] ) && $values2['function'][0] instanceof \WPML_URL_Filters ) {
|
||
|
unset( $wp_filter['page_link']->callbacks[ $key ] );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Only valid for "CSS & JS Manager" -- "Manage CSS/JS" -- ("Posts" | "Pages" | "Custom Post Types" | "Media")
|
||
|
*/
|
||
|
public function enqueueScripts()
|
||
|
{
|
||
|
if (! isset($_REQUEST['wpacu_for'])) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$isManageCssJsDash = isset($_GET['page']) && $_GET['page'] === WPACU_PLUGIN_ID.'_assets_manager';
|
||
|
$subPage = isset($_GET['wpacu_sub_page']) ? $_GET['wpacu_sub_page'] : 'manage_css_js';
|
||
|
|
||
|
$loadAutoCompleteOnManageCssJsDash = ($isManageCssJsDash && $subPage === 'manage_css_js') &&
|
||
|
in_array($_REQUEST['wpacu_for'], array('posts', 'pages', 'media-attachment', 'custom-post-types'));
|
||
|
|
||
|
if ( ! $loadAutoCompleteOnManageCssJsDash ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$wpacuFor = sanitize_text_field($_REQUEST['wpacu_for']);
|
||
|
|
||
|
switch ($wpacuFor) {
|
||
|
case 'posts':
|
||
|
$forPostType = 'post';
|
||
|
break;
|
||
|
case 'pages':
|
||
|
$forPostType = 'page';
|
||
|
break;
|
||
|
case 'media-attachment':
|
||
|
$forPostType = 'attachment';
|
||
|
break;
|
||
|
case 'custom-post-types':
|
||
|
$forPostType = 'wpacu-custom-post-types';
|
||
|
break;
|
||
|
default:
|
||
|
$forPostType = '';
|
||
|
}
|
||
|
|
||
|
if ( ! $forPostType ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
wp_enqueue_script(
|
||
|
OwnAssets::$ownAssets['scripts']['autocomplete_search']['handle'],
|
||
|
plugins_url(OwnAssets::$ownAssets['scripts']['autocomplete_search']['rel_path'], WPACU_PLUGIN_FILE),
|
||
|
array('jquery', 'jquery-ui-autocomplete'),
|
||
|
OwnAssets::assetVer(OwnAssets::$ownAssets['scripts']['autocomplete_search']['rel_path']),
|
||
|
true
|
||
|
);
|
||
|
|
||
|
wp_localize_script(OwnAssets::$ownAssets['scripts']['autocomplete_search']['handle'], 'wpacu_autocomplete_search_obj', array(
|
||
|
'ajax_url' => esc_url(admin_url('admin-ajax.php')),
|
||
|
'ajax_nonce' => wp_create_nonce('wpacu_autocomplete_search_nonce'),
|
||
|
'ajax_action' => WPACU_PLUGIN_ID . '_autocomplete_search',
|
||
|
'post_type' => $forPostType,
|
||
|
'redirect_to' => esc_url(admin_url('admin.php?page=wpassetcleanup_assets_manager&wpacu_for='.$wpacuFor.'&wpacu_post_id=post_id_here'))
|
||
|
));
|
||
|
|
||
|
wp_enqueue_style(
|
||
|
OwnAssets::$ownAssets['styles']['autocomplete_search_jquery_ui_custom']['handle'],
|
||
|
plugins_url(OwnAssets::$ownAssets['styles']['autocomplete_search_jquery_ui_custom']['rel_path'], WPACU_PLUGIN_FILE),
|
||
|
false, null, false
|
||
|
);
|
||
|
|
||
|
$jqueryUiCustom = <<<CSS
|
||
|
#wpacu-search-form-assets-manager input[type=text].ui-autocomplete-loading {
|
||
|
background-position: 99% 6px;
|
||
|
}
|
||
|
CSS;
|
||
|
wp_add_inline_style(OwnAssets::$ownAssets['styles']['autocomplete_search_jquery_ui_custom']['handle'], $jqueryUiCustom);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
public function wpAjaxSearch()
|
||
|
{
|
||
|
check_ajax_referer('wpacu_autocomplete_search_nonce', 'wpacu_security');
|
||
|
|
||
|
global $wpdb;
|
||
|
|
||
|
$search_term = isset($_REQUEST['wpacu_term']) ? sanitize_text_field($_REQUEST['wpacu_term']) : '';
|
||
|
$post_type = isset($_REQUEST['wpacu_post_type']) ? sanitize_text_field($_REQUEST['wpacu_post_type']) : '';
|
||
|
|
||
|
if ( $search_term === '' ) {
|
||
|
echo wp_json_encode(array());
|
||
|
}
|
||
|
|
||
|
$results = array();
|
||
|
|
||
|
if ($post_type !== 'attachment') {
|
||
|
// 'post', 'page', custom post types
|
||
|
$queryDataByKeyword = array(
|
||
|
'post_type' => $post_type,
|
||
|
's' => $search_term,
|
||
|
'post_status' => array( 'publish', 'private' ),
|
||
|
'posts_per_page' => -1,
|
||
|
'suppress_filters' => true
|
||
|
);
|
||
|
} else {
|
||
|
// 'attachment'
|
||
|
$search = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title = '%s'", $search_term ) );
|
||
|
$queryDataByKeyword = array(
|
||
|
'post_type' => 'attachment',
|
||
|
'post_status' => 'inherit',
|
||
|
'orderby' => 'date',
|
||
|
'order' => 'DESC',
|
||
|
'post__in' => $search,
|
||
|
'suppress_filters' => true
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// Standard search
|
||
|
$query = new \WP_Query($queryDataByKeyword);
|
||
|
|
||
|
// No results? Search by ID in case the admin put the post/page ID in the search box
|
||
|
if (! $query->have_posts()) {
|
||
|
// This one works for any post type, including 'attachment'
|
||
|
$queryDataByID = array(
|
||
|
'post_type' => $post_type,
|
||
|
'p' => $search_term,
|
||
|
'post_status' => array( 'publish', 'private' ),
|
||
|
'posts_per_page' => -1,
|
||
|
'post__in' => $search_term,
|
||
|
'suppress_filters' => true
|
||
|
);
|
||
|
|
||
|
$query = new \WP_Query($queryDataByID);
|
||
|
}
|
||
|
|
||
|
if ($query->have_posts()) {
|
||
|
$pageOnFront = $pageForPosts = false;
|
||
|
|
||
|
if ($post_type === 'page' && get_option('show_on_front') === 'page') {
|
||
|
$pageOnFront = (int)get_option('page_on_front');
|
||
|
$pageForPosts = (int)get_option('page_for_posts');
|
||
|
}
|
||
|
|
||
|
while ($query->have_posts()) {
|
||
|
$query->the_post();
|
||
|
$resultPostId = get_the_ID();
|
||
|
$resultPostStatus = get_post_status($resultPostId);
|
||
|
|
||
|
$resultToShow = get_the_title() . ' / ID: '.$resultPostId;
|
||
|
|
||
|
if ($resultPostStatus === 'private') {
|
||
|
$iconPrivate = '<span class="dashicons dashicons-lock"></span>';
|
||
|
$resultToShow .= ' / '.$iconPrivate.' Private';
|
||
|
}
|
||
|
|
||
|
// This is a page, and it was set as the homepage (point this out)
|
||
|
if ($pageOnFront === $resultPostId) {
|
||
|
$iconHome = '<span class="dashicons dashicons-admin-home"></span>';
|
||
|
$resultToShow .= ' / '.$iconHome.' Homepage';
|
||
|
}
|
||
|
|
||
|
if ($pageForPosts === $resultPostId) {
|
||
|
$iconPost = '<span class="dashicons dashicons-admin-post"></span>';
|
||
|
$resultToShow .= ' / '.$iconPost.' Posts page';
|
||
|
}
|
||
|
|
||
|
$results[] = array(
|
||
|
'id' => $resultPostId,
|
||
|
'label' => $resultToShow,
|
||
|
'link' => get_the_permalink()
|
||
|
);
|
||
|
}
|
||
|
wp_reset_postdata();
|
||
|
}
|
||
|
|
||
|
if (empty($results)) {
|
||
|
echo 'no_results';
|
||
|
wp_die();
|
||
|
}
|
||
|
|
||
|
echo wp_json_encode($results);
|
||
|
wp_die();
|
||
|
}
|
||
|
}
|