Warning: Undefined array key "yPBFjS" in /home/ic3/domains/ic3.info/public_html/wp-includes/kses.php on line 1
HEX
HEX
Server: LiteSpeed
System: Linux control5.webnow.vn 4.18.0-553.83.1.lve.el8.x86_64 #1 SMP Wed Nov 12 10:04:12 UTC 2025 x86_64
User: ic3 (1169)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /home/ic3/domains/ic3.info/private_html/wp-content/plugins/foxtool/inc/search.php
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $foxtool_search_options;
# tao api custom post type post and product
if (isset($foxtool_search_options['main-search1'])){
// xóa post khoi json neu xoa
function foxtool_delete_search_auto_when_delete_post($post_id) {
    $upload_dir = wp_upload_dir();
    $file_path = $upload_dir['basedir'] . '/json/data-search.json';
    $existing_data = array();
    if (file_exists($file_path)) {
        $existing_data = json_decode(file_get_contents($file_path), true);
        foreach ($existing_data as $key => $item) {
            if ($item['ID'] == $post_id) {
                unset($existing_data[$key]);
                break; 
            }
        }
        // Reset array keys
        $existing_data = array_values($existing_data);
        file_put_contents($file_path, json_encode($existing_data));
    }
}
add_action('delete_post', 'foxtool_delete_search_auto_when_delete_post');
// them post vào json
function foxtool_add_search_auto_whenpublish($post_id ) {
        global $foxtool_search_options;
		
		// Tránh vô tình cập nhật khi auto-saved
		if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
		
		// Kiểm tra xem main-search-posttype có tồn tại và có dữ liệu hay không
		if (!isset($foxtool_search_options['main-search-posttype']) || !is_array($foxtool_search_options['main-search-posttype']) || empty($foxtool_search_options['main-search-posttype'])) {
			return; 
		}

		// Tránh xử lý cho các bài viết không phải là sản phẩm
		if (!in_array(get_post_type($post_id), $foxtool_search_options['main-search-posttype'])) {
			return;
		}
		
        $post = get_post($post_id);
        $type = get_post_type($post->ID);
        if (isset($foxtool_search_options['main-search-posttype'])) {
            if(count($foxtool_search_options['main-search-posttype'])>0){
                $allowed_post_types = $foxtool_search_options['main-search-posttype'];
                if (in_array($type, $allowed_post_types)) {
                    $filed = array(
                    'ID',
                    'title',
                    'url',
                    'thum',
					'price',
                    'taxonomy'
                );
                    $item = array('type' => $type);
                    foreach ($filed as $field) {
                        switch ($field) {
                            case 'ID':
                                $item[$field] = $post->ID;
                            break;
                            case 'title':
                                $item[$field] = get_the_title($post->ID);
                                break;
                            case 'url':
                                $item[$field] = get_permalink($post->ID);
                                break;
                            case 'thum':
                                $item[$field] = get_the_post_thumbnail_url($post->ID);
                                break;
                            case 'price':
                                if ($type === 'product') {
									if (function_exists('wc_get_product')) {
										$product = wc_get_product($post->ID);
										if ($product->is_type('variable')) {
											$prices = [];
											$available_variations = $product->get_available_variations();
											foreach ($available_variations as $variation) {
												$variation_obj = new WC_Product_Variation($variation['variation_id']);
												$prices[] = $variation_obj->get_price();
											}
											if (!empty($prices)) {
												$min_price = min($prices);
												$max_price = max($prices);
												$item[$field] = wc_price($min_price) . ' – ' . wc_price($max_price);
											} else {
												$item[$field] = wc_price($product->get_price());
											}
										} else {
											$item[$field] = wc_price($product->get_price());
										}
									}
								}
                                break;
                            case 'taxonomy':
                                if ($post->post_type == 'product') {
                                    $taxonomy_terms = wp_get_post_terms($post->ID, 'product_cat');
                                    if ($taxonomy_terms && !is_wp_error($taxonomy_terms)) {
                                        $first_term = reset($taxonomy_terms);
                                        $item[$field] = $first_term->name;
                                    }
                                } else {
                                    $object_taxonomies = get_object_taxonomies($post->post_type);
                                    foreach ($object_taxonomies as $taxonomy_name) {
                                        $taxonomy_terms = get_the_terms($post->ID, $taxonomy_name);
                                        if ($taxonomy_terms && !is_wp_error($taxonomy_terms)) {
                                            $first_term = reset($taxonomy_terms);
                                            $item[$field] = $first_term->name;
                                            break;
                                        }
                                    }
                                }
                                break;
                        }
                    }
                    $newitem[$post->ID] = $item;
                    $upload_dir = wp_upload_dir();
                    $json_dir = $upload_dir['basedir'] . '/json';
                    if (!is_dir($json_dir)) {
                        mkdir($json_dir);
                    }
                    $file_path = $json_dir . '/data-search.json';
                    $existing_data = array();
                    if (file_exists($file_path)) {
                        $existing_data = json_decode(file_get_contents($file_path), true);
                    }
                    $merged_data = foxtool_merged_array($existing_data,$newitem);
                    file_put_contents($file_path, json_encode($merged_data));
                }
            }
        }
}
add_action('wp_insert_post', 'foxtool_add_search_auto_whenpublish');
// lay name tu custom post type
function foxtool_post_type_name($post_type_slug) {
    $post_type_object = get_post_type_object($post_type_slug);
    if ($post_type_object) {
        $post_type_name = $post_type_object->labels->singular_name;
        return $post_type_name; 
    } 
}
// tao mang json
function foxtool_search($page = 1, $posts_per_page = 2000) {
    global $foxtool_search_options;
    if (isset($foxtool_search_options['main-search-posttype'])) {
        if(count($foxtool_search_options['main-search-posttype'])>0){
            foreach ($foxtool_search_options['main-search-posttype'] as $key => $type) {
                $post_types[$type] = array(
                        'type' => $type,
                        'fields' => array(
                            'ID',
                            'title',
                            'url',
                            'thum',
                            'price',
                            'taxonomy'
                        )
                );
            }
        }  
    } 
    $args = array(
        'numberposts' => $posts_per_page,
        'offset'      => ($page - 1) * $posts_per_page,
        'post_type'   => array_keys($post_types),
    );
    $posts = get_posts($args);
    $results = array();
    foreach ($posts as $post) {
        $post_type = $post->post_type;
        if (isset($post_types[$post_type])) {
            $type_info = $post_types[$post_type];
            $type = $type_info['type'];
            $item = array('type' => $type);
            foreach ($type_info['fields'] as $field) {
                switch ($field) {
                    case 'ID':
                        $item[$field] = $post->ID;
                        break;
                    case 'title':
                        $item[$field] = $post->post_title;
                        break;
                    case 'url':
                        $item[$field] = get_permalink($post->ID);
                        break;
                    case 'thum':
                        $item[$field] = get_the_post_thumbnail_url($post->ID);
                        break;
                    case 'price':
                        if ($type === 'product') {
							if (function_exists('wc_get_product')) {
								$product = wc_get_product($post->ID);
								if ($product->is_type('variable')) {
									$prices = [];
									$available_variations = $product->get_available_variations();
									foreach ($available_variations as $variation) {
										$variation_obj = new WC_Product_Variation($variation['variation_id']);
										$prices[] = $variation_obj->get_price();
									}
									if (!empty($prices)) {
										$min_price = min($prices);
										$max_price = max($prices);
										$item[$field] = wc_price($min_price) . ' – ' . wc_price($max_price);
									} else {
										$item[$field] = wc_price($product->get_price());
									}
								} else {
									$item[$field] = wc_price($product->get_price());
								}
							}
						}
                        break;
                    case 'taxonomy':
                        if ($post->post_type == 'product') {
                            $taxonomy_terms = wp_get_post_terms($post->ID, 'product_cat');
                            if ($taxonomy_terms && !is_wp_error($taxonomy_terms)) {
                                $first_term = reset($taxonomy_terms);
                                $item[$field] = $first_term->name;
                            }
                        } else {
                            $object_taxonomies = get_object_taxonomies($post->post_type);
                            foreach ($object_taxonomies as $taxonomy_name) {
                                $taxonomy_terms = get_the_terms($post->ID, $taxonomy_name);
                                if ($taxonomy_terms && !is_wp_error($taxonomy_terms)) {
                                    $first_term = reset($taxonomy_terms);
                                    $item[$field] = $first_term->name;
                                    break;
                                }
                            }
                        }
                        break;
                }
            }
            $results[$post->ID] = $item;
        }
    }
    return $results;
}
// ajax tao file json 
function foxtool_json_file_callback(){
	global $foxtool_search_options;
    check_ajax_referer('foxtool_search_get', 'security');
	if (!current_user_can('manage_options')){
        wp_die(__('Insufficient permissions', 'foxtool'));
    }
    $page = $_POST['page'];
    $data =  foxtool_search($page);
    if (empty($data)) {
        echo json_encode(array('page' => -1));
        wp_die();
    }
    $upload_dir = wp_upload_dir();
    $json_dir = $upload_dir['basedir'] . '/json';
    if (!is_dir($json_dir)) {
        mkdir($json_dir);
    }
    $file_path = $json_dir . '/data-search.json';
    $existing_data = array();
    if (file_exists($file_path)) {
        $existing_data = json_decode(file_get_contents($file_path), true);
    }
    // Xóa các custom post type không tồn tại trong main-search-posttype
    if (isset($foxtool_search_options['main-search-posttype']) && count($foxtool_search_options['main-search-posttype']) > 0) {
        $allowed_post_types = $foxtool_search_options['main-search-posttype'];
        foreach ($existing_data as $key => $item) {
            if (!in_array($item['type'], $allowed_post_types)) {
                unset($existing_data[$key]);
            }
        }
        $existing_data = array_values($existing_data);
    }
    $merged_data = foxtool_merged_array($existing_data, $data);
    file_put_contents($file_path, json_encode($merged_data));
    $count = count($merged_data);
    echo json_encode(array('page' =>$page+1,'count'=>$count));   
    wp_die();
}
add_action('wp_ajax_foxtool_json_get', 'foxtool_json_file_callback');
// ajax xoa thư mục json
function foxtool_delete_json_folder_callback() {
    check_ajax_referer('foxtool_search_del', 'security');
    if (!current_user_can('manage_options')){
        wp_die(__('Insufficient permissions', 'foxtool'));
    }
    $upload_dir = wp_upload_dir();
    $json_dir = $upload_dir['basedir'] . '/json';
    if (is_dir($json_dir)) {
        $files = glob("$json_dir/*");
        foreach ($files as $file) {
            if (is_file($file)) {
                unlink($file);
            }
        }
        rmdir($json_dir);
    }
    wp_die();
}
add_action('wp_ajax_foxtool_json_del', 'foxtool_delete_json_folder_callback');
// xu ly du lieu json
function foxtool_merged_array($existing_data, $data) {
    $merged_data = $existing_data;
    foreach ($data as $new_item) {
        $found = false;
        foreach ($merged_data as &$existing_item) {
            if ($existing_item['ID'] == $new_item['ID']) {
                $existing_item = $new_item;
                $found = true;
                break;
            }
        }
        if (!$found) {
            $merged_data[] = $new_item;
        }
    }
    return array_values($merged_data);
}
// duong dan toi json trong plugin
function foxtool_search_url(){
    $upload_dir = wp_upload_dir();
    $json_file = $upload_dir['basedir'] . '/json/data-search.json';
    if (file_exists($json_file)) {
        $absolute_url = $upload_dir['baseurl'] . '/json/data-search.json';
        $relative_url = wp_make_link_relative($absolute_url);
        $random_version = rand(1000, 9999);
        return $relative_url . '?ver=' . $random_version;
    }
    return null;
}
// dua vao website
function foxtool_search_footer(){ 
	global $foxtool_search_options;
	$limit = !empty($foxtool_search_options['main-search-c1']) ? $foxtool_search_options['main-search-c1'] : 10;
	if (isset($foxtool_search_options['main-search-posttype'])) {
		$main_search_post_types = $foxtool_search_options['main-search-posttype'];
		if (in_array('product', $main_search_post_types)) {
			unset($main_search_post_types[array_search('product', $main_search_post_types)]);
			array_unshift($main_search_post_types, 'product');
		}
		$data_types = implode(',', $main_search_post_types);
		$data_labels = [];
		foreach ($main_search_post_types as $id) {
			$data_labels[] = foxtool_post_type_name($id);
		}
		$data_labels_str = implode(',', $data_labels);
	} else {
		$data_types = '';
		$data_labels_str = '';
	}
	?>
		<div class="ft-sbox ft-smodal" id="ft-sbox" style="display:none">
			<form class="ft-sform" action="<?php bloginfo('url'); ?>">
			<?php 
            if (isset($foxtool_search_options['main-search-posttype']) && in_array('product', $foxtool_search_options['main-search-posttype'])) {
				echo '<input type="hidden" name="post_type" value="product">';
			}
			?>
			<input type="text" id="ft-sinput" placeholder="<?php _e('Enter keywords to search', 'foxtool'); ?>" name="s" value="" maxlength="50" required="required">
			<button title="<?php _e('Search', 'foxtool'); ?>" id="ft-ssumit" type="submit">
			<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 42 42"><path fill="currentColor" d="M1 17.838c0 8.747 7.131 15.827 15.94 15.827c8.796 0 15.938-7.08 15.938-15.827S25.736 2 16.94 2C8.131 2 1 9.091 1 17.838zm5.051 0c0-5.979 4.868-10.817 10.89-10.817c6.01 0 10.888 4.839 10.888 10.817c0 5.979-4.878 10.818-10.888 10.818c-6.022 0-10.89-4.84-10.89-10.818zm22.111 14.523l6.855 7.809c1.104 1.102 1.816 1.111 2.938 0l2.201-2.181c1.082-1.081 1.149-1.778 0-2.921l-7.896-6.775l-4.098 4.068z"/></svg>
			</button>
			</form>
			<div class="ft-sbox-main">
				<div id="ft-staxo"></div>
				<ul id="ft-show" data-types="<?php echo esc_attr($data_types); ?>" data-labels="<?php echo esc_attr($data_labels_str); ?>" data-json="<?php echo base64_encode(foxtool_search_url()); ?>" data-full="<?php echo $limit; ?>" data-none="<?php _e("No results found", "foxtool"); ?>"></ul>
			</div>
		</div>
	<?php
	$color = !empty($foxtool_search_options['main-search-c2']) ? '<style>:root{--ftsearch:'. $foxtool_search_options['main-search-c2'] .';}</style>' : NULL;
	$dark = isset($foxtool_search_options['main-search-s1']) && $foxtool_search_options['main-search-s1'] == 'Dark' ? '<style>:root {--ftsearchbg:#121212;--ftsearchbor:#2d2d2d;--ftsearchspan:#191919;--ftsearchsp:#3f3f3f63;--ftsearchimg:#333333;--ftsearchbl:#1c1c1cf2;--ftsearchcolor:#fff;}</style>' : NULL;
	echo $color . $dark;	
}
add_action('wp_footer', 'foxtool_search_footer');
// add css js search web
function foxtool_enqueue_search(){
	wp_enqueue_style('search-css', FOXTOOL_URL . 'link/search/foxsearch.css', array(), FOXTOOL_VERSION);
	wp_enqueue_script('search-js', FOXTOOL_URL . 'link/search/foxsearch.js', array('jquery'), FOXTOOL_VERSION, true);
}
add_action('wp_enqueue_scripts', 'foxtool_enqueue_search');
// shortoce
if (isset($foxtool_search_options['main-search-code1'])){
function foxtool_search_shortcode($atts) {
	global $foxtool_search_options;
	$color = !empty($foxtool_search_options['main-search-code2']) ? 'style="fill:' . $foxtool_search_options['main-search-code2'] .';"' : NULL;
	$icon = '<span class="ftopensearch" style="display:flex;justify-content:center;align-items:center;"><svg xmlns="http://www.w3.org/2000/svg" width="25px" height="25px" viewBox="0 0 26 26"><path '. $color .' fill="currentColor" d="M10 .188A9.812 9.812 0 0 0 .187 10A9.812 9.812 0 0 0 10 19.813c2.29 0 4.393-.811 6.063-2.125l.875.875a1.845 1.845 0 0 0 .343 2.156l4.594 4.625c.713.714 1.88.714 2.594 0l.875-.875a1.84 1.84 0 0 0 0-2.594l-4.625-4.594a1.824 1.824 0 0 0-2.157-.312l-.875-.875A9.812 9.812 0 0 0 10 .188zM10 2a8 8 0 1 1 0 16a8 8 0 0 1 0-16zM4.937 7.469a5.446 5.446 0 0 0-.812 2.875a5.46 5.46 0 0 0 5.469 5.469a5.516 5.516 0 0 0 3.156-1a7.166 7.166 0 0 1-.75.03a7.045 7.045 0 0 1-7.063-7.062c0-.104-.005-.208 0-.312z"/></svg></span>';
	return $icon;
}
add_shortcode('foxsearch', 'foxtool_search_shortcode');
}
}