<?php
if (!defined('ABSPATH'))
die('No direct access allowed');
final class WOOF_EXT_BY_TEXT_2 extends WOOF_EXT {
public $type = 'by_html_type';
public $html_type = 'by_text_2'; //your custom key here
public $index = 'woof_text';
public $html_type_dynamic_recount_behavior = 'none';
public function __construct() {
parent::__construct();
$this->init();
}
public function get_ext_path() {
return plugin_dir_path(__FILE__);
}
public function get_ext_override_path() {
return get_stylesheet_directory() . DIRECTORY_SEPARATOR . "woof" . DIRECTORY_SEPARATOR . "ext" . DIRECTORY_SEPARATOR . $this->html_type . DIRECTORY_SEPARATOR;
}
public function get_ext_link() {
return plugin_dir_url(__FILE__);
}
public function woof_add_items_keys($keys) {
$keys[] = $this->html_type;
return $keys;
}
public function init() {
if (defined('HUSKY_INIT') && HUSKY_INIT) {
return false;
}
add_filter('woof_add_items_keys', array($this, 'woof_add_items_keys'));
add_filter('woof_get_request_data', array($this, 'woof_get_request_data'));
add_filter('woof_dynamic_count_attr', array($this, 'cache_compatibility'), 99, 2);
add_action('woof_print_html_type_options_' . $this->html_type, array($this, 'woof_print_html_type_options'), 10, 1);
add_action('woof_print_html_type_' . $this->html_type, array($this, 'print_html_type'), 10, 1);
add_action('wp_enqueue_scripts', array($this, 'wp_head'), 9);
add_action('wp_ajax_woof_text_autocomplete', array($this, 'woof_text_autocomplete'));
add_action('wp_ajax_nopriv_woof_text_autocomplete', array($this, 'woof_text_autocomplete'));
self::$includes['js']['woof_' . $this->html_type . '_html_items'] = $this->get_ext_link() . 'js/' . $this->html_type . '.js';
self::$includes['css']['woof_' . $this->html_type . '_html_items'] = $this->get_ext_link() . 'css/' . $this->html_type . '.css';
self::$includes['js_init_functions'][$this->html_type] = 'woof_init_text'; //we have no init function in this case
//***
add_shortcode('woof_text_filter', array($this, 'woof_text_filter'));
}
public function woof_get_request_data($request) {
if (isset($request['s'])) {
$request['woof_text'] = $request['s'];
}
return $request;
}
public function cache_compatibility($args, $type) {
$request = woof()->get_request_data();
if (isset($request['woof_text']) AND $request['woof_text']) {
$args['woof_text'] = $request['woof_text'];
}
return $args;
}
public function wp_head() {
self::$includes['js_code_custom']['woof_' . $this->html_type . '_html_items'] = $this->get_js();
self::$includes['css_code_custom'][$this->index] = $this->get_style();
$request = woof()->get_request_data();
$search_text = "";
if (isset($request['woof_text']) AND $request['woof_text']) {
$search_text = ":" . $request['woof_text'];
}
self::$includes['js_lang_custom'][$this->index] = esc_html__('By text', 'woocommerce-products-filter') . $search_text;
//***
if (isset(woof()->settings['by_text_2']['autocomplete']) AND woof()->settings['by_text_2']['autocomplete']) {
wp_enqueue_script('easy-autocomplete', WOOF_LINK . 'js/easy-autocomplete/jquery.easy-autocomplete.min.js', array('jquery'), WOOF_VERSION);
wp_enqueue_style('easy-autocomplete', WOOF_LINK . 'js/easy-autocomplete/easy-autocomplete.min.css', array(), WOOF_VERSION);
wp_enqueue_style('easy-autocomplete-theme', WOOF_LINK . 'js/easy-autocomplete/easy-autocomplete.themes.min.css', array(), WOOF_VERSION);
}
}
public function get_js() {
ob_start();
?>
var woof_text_autocomplete = 0;
var woof_text_autocomplete_items = 10;
<?php if (isset(woof()->settings['by_text_2']['autocomplete'])): ?>
woof_text_autocomplete =<?php echo intval(woof()->settings['by_text_2']['autocomplete']) ?>;
woof_text_autocomplete_items =<?php esc_html_e(apply_filters('woof_text_autocomplete_items', 10)) ?>;
<?php endif; ?>
var woof_post_links_in_autocomplete = 0;
<?php if (isset(woof()->settings['by_text_2']['post_links_in_autocomplete'])): ?>
woof_post_links_in_autocomplete =<?php echo intval(woof()->settings['by_text_2']['post_links_in_autocomplete']) ?>;
<?php endif; ?>
var how_to_open_links = 0;
<?php if (isset(woof()->settings['by_text_2']['how_to_open_links'])): ?>
how_to_open_links =<?php echo intval(woof()->settings['by_text_2']['how_to_open_links']) ?>;
<?php
endif;
return ob_get_clean();
}
public function get_style() {
ob_start();
if (isset(woof()->settings['by_text_2']['image'])) {
if (!empty(woof()->settings['by_text_2']['image'])) {
?>
.woof_text_search_container .woof_text_search_go{
background: url(<?php echo esc_url(woof()->settings['by_text_2']['image']) ?>) !important;
}
<?php
}
}
return ob_get_clean();
}
//shortcode
public function woof_text_filter($args = array()) {
if (!is_array($args)) {
$args = array();
}
$args['loader_img'] = $this->get_ext_link() . 'img/loader.gif';
if (file_exists($this->get_ext_override_path() . 'views' . DIRECTORY_SEPARATOR . 'shortcodes' . DIRECTORY_SEPARATOR . 'woof_text_filter.php')) {
return woof()->render_html($this->get_ext_override_path() . 'views' . DIRECTORY_SEPARATOR . 'shortcodes' . DIRECTORY_SEPARATOR . 'woof_text_filter.php', $args);
}
return woof()->render_html($this->get_ext_path() . 'views' . DIRECTORY_SEPARATOR . 'shortcodes' . DIRECTORY_SEPARATOR . 'woof_text_filter.php', $args);
}
//settings page hook
public function woof_print_html_type_options() {
woof()->render_html_e($this->get_ext_path() . 'views' . DIRECTORY_SEPARATOR . 'options.php', array(
'key' => $this->html_type,
"woof_settings" => get_option('woof_settings', array())
)
);
}
public function assemble_query_params(&$meta_query, $wp_query = NULL) {
add_filter('posts_where', array($this, 'woof_post_text_filter'), 9999, 2); //for searching by text
return $meta_query;
}
public function woof_post_text_filter($where = '', $query = null) {
global $wp_query;
$request = woof()->get_request_data();
//***
if (!defined('DOING_AJAX')) {
if (!isset($query->query_vars['post_type']) && !isset($query->query_vars['wc_query'])) {
return $where;
}
if ($query->query_vars['post_type'] != "product") {
if (is_array($query->query_vars['post_type'])) {
if (!in_array("product", $query->query_vars['post_type'])) {
return $where;
}
} elseif (!isset($query->query_vars['wc_query']) OR $query->query_vars['wc_query'] != 'product_query') {
return $where;
}
}
}
//***
if (!isset($request['woof_text']) OR!$request['woof_text']) {
return $where;
}
if (defined('DOING_AJAX')) {
$conditions = (isset($wp_query->query_vars['post_type']) AND $wp_query->query_vars['post_type'] == 'product') OR WOOF_REQUEST::isset('woof_products_doing');
} else {
$conditions = WOOF_REQUEST::isset('woof_products_doing');
}
//***
{
if (woof()->is_isset_in_request_data('woof_text')) {
$woof_text = wp_specialchars_decode(trim(urldecode($request['woof_text'])));
$woof_text = trim(WOOF_HELPER::strtolower($woof_text));
$woof_text = preg_replace('/\s+/', ' ', $woof_text);
if (!$woof_text) {
return $where;
}
if (!apply_filters('woof_text_search_like_option', false)) {
$woof_text = preg_quote($woof_text, '&');
$woof_text = str_replace(' ', '?(.*)', $woof_text);
$woof_text = stripslashes($woof_text);
$woof_text = str_replace("'", "'", $woof_text);
$woof_text = str_replace("\"", "\"", $woof_text);
$woof_text = str_replace("\(", "\\\(", $woof_text);
$woof_text = str_replace("\)", "\\\)", $woof_text);
//http://dev.mysql.com/doc/refman/5.7/en/regexp.html
$search_by_full_word = false;
if (isset(woof()->settings['by_text_2']['search_by_full_word'])) {
$search_by_full_word = (int) woof()->settings['by_text_2']['search_by_full_word'];
}
if ($search_by_full_word) {
$woof_text = '[[:<:]]' . $woof_text . '[[:>:]]';
}
//***
$behavior = 'title';
if (isset(woof()->settings['by_text_2']['behavior'])) {
$behavior = woof()->settings['by_text_2']['behavior'];
}
if (WOOF_REQUEST::isset('auto_search_by_behavior') AND!empty(WOOF_REQUEST::get('auto_search_by_behavior'))) {
$behavior = WOOF_REQUEST::get('auto_search_by_behavior');
}
$text_where = "";
//***
switch ($behavior) {
case 'content':
$text_where .= " LOWER(post_content) REGEXP '{$woof_text}'";
break;
case 'title_or_content':
$text_where .= " ( LOWER(post_title) REGEXP '{$woof_text}' OR LOWER(post_content) REGEXP '{$woof_text}')";
break;
case 'title_and_content':
$text_where .= " ( LOWER(post_title) REGEXP '{$woof_text}' AND LOWER(post_content) REGEXP '{$woof_text}')";
break;
case 'excerpt':
$text_where .= " LOWER(post_excerpt) REGEXP '{$woof_text}'";
break;
case 'content_or_excerpt':
$text_where .= " ( LOWER(post_excerpt) REGEXP '{$woof_text}' OR LOWER(post_content) REGEXP '{$woof_text}')";
break;
case 'title_or_content_or_excerpt':
$text_where .= " (( LOWER(post_title) REGEXP '{$woof_text}') OR ( LOWER(post_excerpt) REGEXP '{$woof_text}') OR ( LOWER(post_content) REGEXP '{$woof_text}'))";
break;
default:
//only by title
$text_where .= " LOWER(post_title) REGEXP '{$woof_text}'";
break;
}
} else {
$woof_text = str_replace("\'", "\'", $woof_text);
$woof_text = str_replace("\"", "\"", $woof_text);
$woof_text = str_replace("\(", "\\\(", $woof_text);
$woof_text = str_replace("\)", "\\\)", $woof_text);
$search_by_full_word = false;
if (isset(woof()->settings['by_text_2']['search_by_full_word'])) {
$search_by_full_word = (int) woof()->settings['by_text_2']['search_by_full_word'];
}
$woof_text_array = explode(" ", $woof_text);
$text_where = "";
$text_array = array();
foreach ($woof_text_array as $text) {
if (!$search_by_full_word) {
$text = '%' . $text . '%';
}
$behavior = 'title';
if (isset(woof()->settings['by_text_2']['behavior'])) {
$behavior = woof()->settings['by_text_2']['behavior'];
}
if (WOOF_REQUEST::isset('auto_search_by_behavior') AND!empty(WOOF_REQUEST::get('auto_search_by_behavior'))) {
$behavior = WOOF_REQUEST::get('auto_search_by_behavior');
}
//***
switch ($behavior) {
case 'content':
$text_array[] = "( LOWER(post_content) LIKE '{$text}')";
break;
case 'title_or_content':
$text_array[] = " ( LOWER(post_title) LIKE '{$text}' OR LOWER(post_content) LIKE '{$text}')";
break;
case 'title_and_content':
$text_array[] = " ( LOWER(post_title) LIKE '{$text}' AND LOWER(post_content) LIKE '{$text}')";
break;
case 'excerpt':
$text_array[] = " LOWER(post_excerpt) LIKE '{$text}'";
break;
case 'content_or_excerpt':
$text_array[] = " ( LOWER(post_excerpt) LIKE '{$text}' OR LOWER(post_content) LIKE '{$text}')";
break;
case 'title_or_content_or_excerpt':
$text_array[] .= " (( LOWER(post_title) LIKE '{$text}') OR ( LOWER(post_excerpt) LIKE '{$text}') OR ( LOWER(post_content) LIKE '{$woof_text}'))";
break;
default:
//only by title
$text_array[] = " ( LOWER(post_title) LIKE '{$text}' ) ";
break;
}
}
$text_where = implode(" AND ", $text_array);
}
global $wpdb;
//_variation_description
$var_desc_where = "";
if (isset(woof()->settings['by_text_2']['search_desc_variant']) AND woof()->settings['by_text_2']['search_desc_variant']) {
if (!in_array($behavior, array('excerpt', 'content', 'title'))) {
$condtion_string = "";
if (!empty($woof_text)) {
if (!apply_filters('woof_text_search_like_option', false)) {
$condtion_string .= " LOWER(postmeta.meta_value) REGEXP '{$woof_text}'";
} else {
$condtion_string .= " postmeta.meta_value LIKE '%$woof_text%'";
}
}
//***
$product_variations = $wpdb->get_results("
SELECT posts.ID
FROM $wpdb->posts AS posts
LEFT JOIN $wpdb->postmeta AS postmeta ON ( posts.ID = postmeta.post_id )
WHERE posts.post_type IN ('product_variation')
AND postmeta.meta_key = '_variation_description'
AND ($condtion_string)", ARRAY_N);
//+++
$product_variations_ids = array();
if (!empty($product_variations)) {
foreach ($product_variations as $v) {
$product_variations_ids[] = $v[0];
}
//+++
$product_variations_ids_string = implode(',', $product_variations_ids);
$products = $wpdb->get_results("
SELECT posts.post_parent
FROM $wpdb->posts AS posts
WHERE posts.ID IN ($product_variations_ids_string) AND posts.post_parent > 0", ARRAY_N);
//+++
$product_ids = array();
if (!empty($products)) {
foreach ($products as $v) {
$product_ids[] = $v[0];
}
}
$product_ids = implode(',', array_merge($product_ids, $product_variations_ids));
$var_desc_where .= " $wpdb->posts.ID IN($product_ids)";
}
if ($var_desc_where AND!empty($var_desc_where)) {
$condition = " OR ";
if ($behavior = 'title_and_content') {
$condition = " OR ";
}
$var_desc_where = $condition . $var_desc_where;
}
}
}
//by SKU *******************
$sku_where = "";
if (woof()->settings['by_text_2']['sku_compatibility']) {
//$woof_text = trim(urldecode($request['woof_sku']));
$woof_sku_request = explode(',', $request['woof_text']);
$woof_sku_request = array_map('urldecode', $woof_sku_request);
$woof_sku_request = array_map('trim', $woof_sku_request);
//***
if (!isset(woof()->settings['by_sku']['logic']) OR empty(woof()->settings['by_sku']['logic'])) {
woof()->settings['by_sku']['logic'] = 'LIKE';
}
$condtion_string = "";
if (!empty($woof_sku_request)) {
foreach ($woof_sku_request as $k => $sku) {
if ($k > 0) {
$condtion_string .= " OR ";
}
if (woof()->settings['by_sku']['logic'] == '=') {
$condtion_string .= "postmeta.meta_value " . woof()->settings['by_sku']['logic']. " '$sku'";
} else {
$condtion_string .= "postmeta.meta_value " . woof()->settings['by_sku']['logic']. " '%$sku%'";
}
}
}
//***
$product_variations = $wpdb->get_results("
SELECT posts.ID
FROM $wpdb->posts AS posts
LEFT JOIN $wpdb->postmeta AS postmeta ON ( posts.ID = postmeta.post_id )
WHERE posts.post_type IN ('product_variation','product')
AND postmeta.meta_key = '_sku'
AND ($condtion_string)", ARRAY_N);
//+++
$product_variations_ids = array();
if (!empty($product_variations)) {
foreach ($product_variations as $v) {
$product_variations_ids[] = $v[0];
}
//+++
$product_variations_ids_string = implode(',', $product_variations_ids);
$products = $wpdb->get_results("
SELECT posts.post_parent
FROM $wpdb->posts AS posts
WHERE posts.ID IN ($product_variations_ids_string) AND posts.post_parent > 0", ARRAY_N);
//+++
$product_ids = array();
if (!empty($products)) {
foreach ($products as $v) {
$product_ids[] = $v[0];
}
}
$product_ids = implode(',', array_merge($product_ids, $product_variations_ids));
$sku_where .= " $wpdb->posts.ID IN($product_ids)";
$where_sku = " AND $wpdb->posts.ID IN($product_ids)";
}
if ($sku_where AND!empty($sku_where)) {
$sku_where = " OR " . $sku_where;
}
}
//by SKU end *******************
$where .= " AND ( " . apply_filters('woof_text_search_query', $text_where . $var_desc_where . $sku_where, $woof_text) . " ) ";
}
}
//***
return $where;
}
//ajax
public function woof_text_autocomplete() {
$results = array();
$args = array(
'nopaging' => true,
//'fields' => 'ids',
'post_type' => 'product',
'post_status' => array('publish'),
'orderby' => 'title',
'order' => 'ASC',
'max_num_pages' => intval(WOOF_REQUEST::get('auto_res_count')) > 0 ? intval(WOOF_REQUEST::get('auto_res_count')) : apply_filters('woof_text_autocomplete_items', 10)
);
if (class_exists('SitePress')) {
//$args['lang'] = ICL_LANGUAGE_CODE;
$args['lang'] = apply_filters('wpml_current_language', NULL);
}
//***
$_GET['woof_text'] = WOOF_REQUEST::get('phrase');
if (!empty(WOOF_REQUEST::get('auto_search_by'))) {
WOOF_REQUEST::set('auto_search_by_behavior', WOOF_REQUEST::get('auto_search_by'));
}
add_filter('posts_where', array($this, 'woof_post_text_filter'), 10);
$query = new WP_Query($args);
//+++
//http://easyautocomplete.com/guide
if ($query->have_posts()) {
include_once WOOF_PATH . 'lib' . DIRECTORY_SEPARATOR . 'aq_resizer.php';
foreach ($query->posts as $p) {
$data = array(
"name" => $p->post_title,
"type" => "product"
);
if (has_post_thumbnail($p->ID)) {
$img_src = wp_get_attachment_image_src(get_post_thumbnail_id($p->ID), 'single-post-thumbnail');
$data['icon'] = $img_src[0]; //woof_aq_resize($img_src[0], 100, 100, true);
} else {
$data['icon'] = WOOF_LINK . 'img/not-found.jpg';
}
$data['link'] = get_post_permalink($p->ID);
$results[] = $data;
}
} else {
$results[] = array(
"name" => esc_html__("Products not found!", 'woocommerce-products-filter'),
"type" => "",
"link" => "#",
"icon" => WOOF_LINK . 'img/not-found.jpg'
);
}
die(json_encode($results));
}
}
WOOF_EXT::$includes['html_type_objects']['by_text_2'] = new WOOF_EXT_BY_TEXT_2();