getContent(); $loop_info = ''; foreach ( $params as $key => $param ) { $param_value = vc_loop_get_value( $param ); if ( ! empty( $param_value ) ) $loop_info .= ' ' . $query_builder->getLabel( $key ) . ': ' . $param_value . ';'; } return '
' . '' . '' . $vc_manager->l('Build query') . '' . '
' . $loop_info . '
' . '
'; } function vc_loop_get_value( $param ) { $value = array(); $selected_values = (array)$param['value']; if ( isset( $param['options'] ) && is_array( $param['options'] ) ) { foreach ( $param['options'] as $option ) { if ( is_array( $option ) && isset( $option['value'] ) ) { if ( in_array( ( ( $option['action'] === '-' ? '-' : '' ) . $option['value'] ), $selected_values ) ) $value[] = $option['action'] . $option['name']; } elseif ( is_array( $option ) && isset( $option[0] ) ) { if ( in_array( $option[0], $selected_values ) ) $value[] = $option[1]; } elseif ( in_array( $option, $selected_values ) ) { $value[] = $option; } } } else { $value[] = $param['value']; } return implode( ', ', $value ); } /** * Parses loop settings and creates WP_Query according to manual * * @link http://codex.wordpress.org/Class_Reference/WP_Query */ class VcLoopQueryBuilder { protected $args = array(); public function __construct( $data ) { foreach ( $data as $key => $value ) { $method = 'parse_' . $key; if ( method_exists( $this, $method ) ) { call_user_func(array($this, $method), $value); } } } // Pages count protected function parse_size( $value ) { $this->args['posts_per_page'] = $value === 'All' ? -1 : (int)$value; } // Sorting field protected function parse_order_by( $value ) { $this->args['orderby'] = $value; } // Sorting order protected function parse_order( $value ) { $this->args['order'] = $value; } // By post types protected function parse_post_type( $value ) { $this->args['post_type'] = $this->stringToArray( $value ); } // By author protected function parse_authors( $value ) { $this->args['author'] = $value; } // By categories protected function parse_categories( $value ) { $this->args['cats'] = $value; // $in = array(); // $cat_ids = $this->stringToArray( $value ); // foreach ( $cat_ids as $cat ) { // $cat = (int)$cat; // if ( $cat < 0 ) { // $not_in[] = abs( $cat ); // } else { // $in[] = $cat; // } // } // $this->args['cat__in'] = $in; } // By taxonomies protected function parse_tax_query( $value ) { $terms = $this->stringToArray( $value ); if ( empty( $this->args['tax_query'] ) ) { $this->args['tax_query'] = array( 'relation' => 'OR' ); } $negative_term_list = array(); foreach ( $terms as $term ) { if ( (int)$term < 0 ) $negative_term_list[] = abs( $term ); } $terms = get_terms( VcLoopSettings::getTaxonomies(), array( 'include' => array_map( 'abs', $terms ) ) ); foreach ( $terms as $t ) { $operator = in_array( (int)$t->term_id, $negative_term_list ) ? 'NOT IN' : 'IN'; $this->args['tax_query'][] = array( 'field' => 'id', 'taxonomy' => $t->taxonomy, 'terms' => $t->term_id, 'operator' => $operator ); } } // By tags ids protected function parse_tags( $value ) { $this->args['tags'] = $value; // $in = $not_in = array(); // $tags_ids = $this->stringToArray( $value ); // foreach ( $tags_ids as $tag ) { // $tag = (int)$tag; // if ( $tag < 0 ) { // $not_in[] = abs( $tag ); // } else { // $in[] = $tag; // } // } // $this->args['tag__in'] = $in; // $this->args['tag__not_in'] = $not_in; } // By posts ids protected function parse_by_id( $value ) { $in = $not_in = array(); $ids = $this->stringToArray( $value ); foreach ( $ids as $id ) { $id = (int)$id; if ( $id < 0 ) { $not_in[] = abs( $id ); } else { $in[] = $id; } } $this->args['post__in'] = $in; $this->args['post__not_in'] = $not_in; } public function excludeId( $id ) { if ( ! isset( $this->args['post__not_in'] ) ) $this->args['post__not_in'] = array(); $this->args['post__not_in'][] = $id; } /** * Converts string to array. Filters empty arrays values * * @param $value * @return array */ protected function stringToArray( $value ) { $valid_values = array(); $list = preg_split( '/\,[\s]*/', $value ); foreach ( $list as $v ) { if ( strlen( $v ) > 0 ) $valid_values[] = $v; } return $valid_values; } public function build() { $db = Db::getInstance(); $context = Context::getContext(); $id_lang = $context->language->id; $id_shop = $context->shop->id; $sql = "SELECT sbpl.* FROM "._DB_PREFIX_."smart_blog_post sbp INNER JOIN "._DB_PREFIX_."smart_blog_post_lang sbpl ON sbp.id_smart_blog_post=sbpl.id_smart_blog_post"; $sql .= " INNER JOIN "._DB_PREFIX_."smart_blog_post_shop sbps ON sbpl.id_smart_blog_post=sbps.id_smart_blog_post"; $sql .= " LEFT JOIN "._DB_PREFIX_."smart_blog_post_category sbpc ON sbpc.id_smart_blog_post=sbp.id_smart_blog_post"; $sql .= " LEFT JOIN "._DB_PREFIX_."smart_blog_post_tag sbpt ON sbpt.id_post=sbp.id_smart_blog_post"; $sql .= " WHERE sbps.id_shop={$id_shop} AND sbpl.id_lang={$id_lang} AND sbp.active=1"; if(isset($this->args['cats']) && !empty($this->args['cats']) ){ $sql .= " AND sbpc.id_smart_blog_category IN ({$this->args['cats']})"; } if(isset($this->args['tags']) && !empty($this->args['tags']) ){ $sql .= " AND sbpt.id_tag IN ({$this->args['tags']})"; } if(isset($this->args['orderby']) && !empty($this->args['orderby']) ){ if($this->args['orderby'] == 'meta_title' || $this->args['orderby'] == 'link_rewrite'){ $orderby = "sbpl.{$this->args['orderby']}"; }elseif($this->args['orderby'] == 'date'){ $this->args['orderby'] = 'created'; $orderby = "sbp.{$this->args['orderby']}"; }else{ $orderby = "sbp.{$this->args['orderby']}"; } $sql .= " ORDER BY {$orderby}"; if(isset($this->args['order']) && !empty($this->args['order']) ){ $sql .= " {$this->args['order']}"; } } if(isset($this->args['posts_per_page']) && !empty($this->args['posts_per_page']) ){ $sql .= " LIMIT {$this->args['posts_per_page']}"; } $results = $db->executeS($sql,true,false); foreach ($results as $result_key => $result_val) { $results[$result_key]['content'] = $result_val['short_description']; } return array($this->args, $results); // return array( $this->args, new WP_Query( $this->args ) ); } } class VcLoopSettings { // Available parts of loop for WP_Query object. protected $content = array(); protected $parts; protected $query_parts = array( 'size', 'order_by', 'order', 'categories', 'tags', ); function __construct( $value, $settings = array() ) { $vc_manager = vc_manager(); $this->parts = array( 'size' => $vc_manager->l('Post Count'), 'order_by' => $vc_manager->l('Order By'), 'order' => $vc_manager->l('Order'), 'categories' => $vc_manager->l('Categories'), 'tags' => $vc_manager->l('Tags'), ); $this->settings = $settings; // Parse loop string $data = $this->parseData( $value ); foreach ( $this->query_parts as $part ) { $value = isset( $data[$part] ) ? $data[$part] : ''; $locked = $this->getSettings( $part, 'locked' ) === 'true'; // Predefined value check. if ( ! is_null( $this->getSettings( $part, 'value' ) ) && $this->replaceLockedValue( $part ) && ( $locked === true || strlen( (string)$value ) == 0 ) ) { $value = $this->settings[$part]['value']; } elseif ( ! is_null( $this->getSettings( $part, 'value' ) ) && ! $this->replaceLockedValue( $part ) && ( $locked === true || strlen( (string)$value ) == 0 ) ) { $value = implode( ',', array_unique( explode( ',', $value . ',' . $this->settings[$part]['value'] ) ) ); } // Find custom method for parsing if ( method_exists( $this, 'parse_' . $part ) ) { $method = 'parse_' . $part; //$this->content[$part] = $this->$method( $value ); $this->content[$part] = call_user_func(array($this, $method), $value); } else { $this->content[$part] = $this->parseString( $value ); } // Set locked if value is locked by settings if ( $locked ) $this->content[$part]['locked'] = true; // if ( $this->getSettings( $part, 'hidden' ) === 'true' ) { $this->content[$part]['hidden'] = true; } } } protected function replaceLockedValue( $part ) { return in_array( $part, array( 'size', 'order_by', 'order' ) ); } public function getLabel( $key ) { return isset( $this->parts[$key] ) ? $this->parts[$key] : $key; } public function getSettings( $part, $name ) { $settings_exists = isset( $this->settings[$part] ) && is_array( $this->settings[$part] ); return $settings_exists && isset( $this->settings[$part][$name] ) ? $this->settings[$part][$name] : null; } public function parseString( $value ) { return array( 'value' => $value ); } protected function parseDropDown( $value, $options = array() ) { return array( 'value' => $value, 'options' => $options ); } protected function parseMultiSelect( $value, $options = array() ) { return array( 'value' => explode( ',', $value ), 'options' => $options ); } public function parse_order_by( $value ) { $vc_manager = vc_manager(); return $this->parseDropDown( $value, array( //array('none', $vc_manager->l("None")), array( 'created', $vc_manager->l("Date") ), array( 'id_smart_blog_post', $vc_manager->l("ID") ), // array( 'author', $vc_manager->l("Author") ), array( 'meta_title', $vc_manager->l("Title") ), //'name', array( 'modified', $vc_manager->l("Modified") ), //'parent', array( 'position', $vc_manager->l("Position") ), // array( 'comment_count', $vc_manager->l("Comment count") ), array( 'link_rewrite', $vc_manager->l("Slug") ), ) ); } public function parse_order( $value ) { $vc_manager = vc_manager(); return $this->parseDropDown( $value, array( array( 'ASC', $vc_manager->l("Ascending") ), array( 'DESC', $vc_manager->l("Descending") ) ) ); } public function parse_post_type( $value ) { $options = array(); $args = array( 'public' => true ); $post_types = get_post_types( $args ); foreach ( $post_types as $post_type ) { if ( $post_type != 'attachment' ) { $options[] = $post_type; } } return $this->parseMultiSelect( $value, $options ); } public function parse_authors( $value ) { $options = $not_in = array(); if ( empty( $value ) ) return $this->parseMultiSelect( $value, $options ); $list = explode( ',', $value ); foreach ( $list as $id ) { if ( (int)$id < 0 ) $not_in[] = abs( $id ); } $users = get_users( array( 'include' => array_map( 'abs', $list ) ) ); foreach ( $users as $user ) { $options[] = array( 'value' => (string)$user->ID, 'name' => $user->data->user_nicename, 'action' => in_array( (int)$user->ID, $not_in ) ? '-' : '+' ); } return $this->parseMultiSelect( $value, $options ); } public function parse_categories( $value ) { $options = $not_in = array(); if ( empty( $value ) ) return $this->parseMultiSelect( $value, $options ); $list = explode( ',', $value ); foreach ( $list as $id ) { if ( (int)$id < 0 ) $not_in[] = abs( $id ); } $id_lang = (int)Context::getContext()->language->id; $titlefield = 'meta_title'; $smartblog = Module::getInstanceByName('smartblog'); if(Tools::version_compare($smartblog->version, '2.1', '>=')){ $titlefield = 'name'; } $list = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT * FROM `'._DB_PREFIX_.'smart_blog_category` sbc INNER JOIN `'._DB_PREFIX_.'smart_blog_category_lang` sbcl ON(sbc.`id_smart_blog_category` = sbcl.`id_smart_blog_category` AND sbcl.`id_lang` = '.(int)($id_lang).') INNER JOIN `'._DB_PREFIX_.'smart_blog_category_shop` sbs ON sbs.id_smart_blog_category = sbc.id_smart_blog_category WHERE sbc.id_smart_blog_category IN('.$value.') AND sbc.`active`= 1 AND sbs.id_shop = '.(int) Context::getContext()->shop->id); // $list = get_categories( array( 'include' => array_map( 'abs', $list ) ) ); foreach ( $list as $obj ) { $options[] = array( 'value' => (string)$obj['id_smart_blog_category'], 'name' => $obj[$titlefield], 'action' => in_array( (int)$obj['id_smart_blog_category'], $not_in ) ? '-' : '+' ); } return $this->parseMultiSelect( $value, $options ); } public function parse_tags( $value ) { $options = $not_in = array(); if ( empty( $value ) ) return $this->parseMultiSelect( $value, $options ); $list = explode( ',', $value ); foreach ( $list as $id ) { if ( (int)$id < 0 ) $not_in[] = abs( $id ); } $id_lang = (int)Context::getContext()->language->id; $smartblog = Module::getInstanceByName('smartblog'); if(Tools::version_compare($smartblog->version, '2.1', '>=')){ $sql = 'SELECT * FROM `'._DB_PREFIX_.'smart_blog_tag` WHERE id_lang='.$id_lang.' AND id_tag IN('.$value.')'; $list = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); foreach ( $list as $obj ) { $options[] = array( 'value' => (string)$obj['id_tag'], 'name' => $obj['name'], 'action' => in_array( (int)$obj['id_tag'], $not_in ) ? '-' : '+' ); } return $this->parseMultiSelect( $value, $options ); } } public function parse_tax_query( $value ) { $options = $not_in = array(); if ( empty( $value ) ) return $this->parseMultiSelect( $value, $options ); $list = explode( ',', $value ); foreach ( $list as $id ) { if ( (int)$id < 0 ) $not_in[] = abs( $id ); } $list = get_terms( VcLoopSettings::getTaxonomies(), array( 'include' => array_map( 'abs', $list ) ) ); foreach ( $list as $obj ) { $options[] = array( 'value' => (string)$obj->term_id, 'name' => $obj->name, 'action' => in_array( (int)$obj->term_id, $not_in ) ? '-' : '+' ); } return $this->parseMultiSelect( $value, $options ); } public function parse_by_id( $value ) { $options = $not_in = array(); if ( empty( $value ) ) return $this->parseMultiSelect( $value, $options ); $list = explode( ',', $value ); foreach ( $list as $id ) { if ( (int)$id < 0 ) $not_in[] = abs( $id ); } $list = get_posts( array( 'post_type' => 'any', 'include' => array_map( 'abs', $list ) ) ); foreach ( $list as $obj ) { $options[] = array( 'value' => (string)$obj->ID, 'name' => $obj->post_title, 'action' => in_array( (int)$obj->ID, $not_in ) ? '-' : '+' ); } return $this->parseMultiSelect( $value, $options ); } public function render() { echo json_encode( $this->content ); } public function getContent() { return $this->content; } /** * get list of taxonomies which has no tags and categories items. * * @static * @return array */ public static function getTaxonomies() { $taxonomy_exclude = (array)apply_filters( 'get_categories_taxonomy', 'category' ); $taxonomy_exclude[] = 'post_tag'; $taxonomies = array(); foreach ( get_taxonomies() as $taxonomy ) { if ( ! in_array( $taxonomy, $taxonomy_exclude ) ) $taxonomies[] = $taxonomy; } return $taxonomies; } public static function buildDefault( $settings ) { if ( ! isset( $settings['settings'] ) || ! is_array( $settings['settings'] ) ) return ''; $value = ''; foreach ( $settings['settings'] as $key => $val ) { if ( isset( $val['value'] ) ) $value .= ( empty( $value ) ? '' : '|' ) . $key . ':' . $val['value']; } return $value; } public static function buildWpQuery( $query, $exclude_id = false ) { $data = self::parseData( $query ); // var_dump($data);die(); $query_builder = new VcLoopQueryBuilder( $data ); if ( $exclude_id ) $query_builder->excludeId( $exclude_id ); return $query_builder->build( $exclude_id ); } public static function parseData( $value ) { $data = array(); $values_pairs = preg_split( '/\|/', $value ); foreach ( $values_pairs as $pair ) { if ( ! empty( $pair ) ) { list( $key, $value ) = preg_split( '/\:/', $pair ); $data[$key] = $value; } } return $data; } } /** * Suggestion list for wp_query field * */ class VcLoopSuggestions { // protected $content = array(); protected $content = ''; protected $exclude = array(); protected $field; function __construct( $field, $query, $exclude ) { $this->exclude = explode( ',', $exclude ); $method_name = 'get_' . preg_replace( '/_out$/', '', $field ); if ( method_exists( $this, $method_name ) ) { call_user_func(array($this, $method_name), $query); } } public function get_authors( $query ) { $args = ! empty( $query ) ? array( 'search' => '*' . $query . '*', 'search_columns' => array( 'user_nicename' ) ) : array(); if ( ! empty( $this->exclude ) ) $args['exclude'] = $this->exclude; $users = get_users( $args ); foreach ( $users as $user ) { $this->content[] = array( 'value' => (string)$user->ID, 'name' => (string)$user->data->user_nicename ); } } public function get_categories( $query ) { // $args = ! empty( $query ) ? array( 'search' => $query ) : array(); $exclude = $exid = ''; if ( ! empty( $this->exclude ) ) { foreach($this->exclude as $k => $v){ if(empty($v)) continue; if($k > 0 && !empty($exid)) $exid .= ','; $exid .= $v; } if(!empty($exid)){ $exclude = 'sbc.id_smart_blog_category NOT IN('; $exclude .= $exid; $exclude .= ') AND '; } } $limit = vc_post_param('limit') ? vc_post_param('limit') : 20; // $categories = get_categories( $args ); // $categories = BlogCategory::getCategory( $args ); $id_lang = (int)Context::getContext()->language->id; // echo 'SELECT * FROM `'._DB_PREFIX_.'smart_blog_category` sbc INNER JOIN `'._DB_PREFIX_.'smart_blog_category_lang` sbcl ON(sbc.`id_smart_blog_category` = sbcl.`id_smart_blog_category` AND sbcl.`id_lang` = '.(int)($id_lang).') // INNER JOIN `'._DB_PREFIX_.'smart_blog_category_shop` sbs ON sbs.id_smart_blog_category = sbc.id_smart_blog_category WHERE '.$exclude.'sbc.`active`= 1 AND sbs.id_shop = '.(int) Context::getContext()->shop->id.' AND sbcl.name LIKE "%'.$query.'%" LIMIT '.$limit; $titlefield = 'meta_title'; $smartblog = Module::getInstanceByName('smartblog'); if(Tools::version_compare($smartblog->version, '2.1', '>=')){ $titlefield = 'name'; } $categories = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'smart_blog_category` sbc INNER JOIN `'._DB_PREFIX_.'smart_blog_category_lang` sbcl ON(sbc.`id_smart_blog_category` = sbcl.`id_smart_blog_category` AND sbcl.`id_lang` = '.(int)($id_lang).') INNER JOIN `'._DB_PREFIX_.'smart_blog_category_shop` sbs ON sbs.id_smart_blog_category = sbc.id_smart_blog_category WHERE '.$exclude.'sbc.`active`= 1 AND sbs.id_shop = '.(int) Context::getContext()->shop->id.' AND sbcl.'.$titlefield.' LIKE "%'.$query.'%" LIMIT '.$limit); if(empty($categories)){ $this->content = ''; return;} foreach ( $categories as $cat ) { $this->content .= $cat[$titlefield] . '|'; $this->content .= $cat['id_smart_blog_category'] . "\n"; } } public function get_tags( $query ) { $smartblog = Module::getInstanceByName('smartblog'); if(Tools::version_compare($smartblog->version, '2.1', '>=')){ $id_lang = (int)Context::getContext()->language->id; $limit = vc_post_param('limit') ? vc_post_param('limit') : 20; $exclude = $exid = ''; if ( ! empty( $this->exclude ) ) { foreach($this->exclude as $k => $v){ if(empty($v)) continue; if($k > 0 && !empty($exid)) $exid .= ','; $exid .= $v; } if(!empty($exid)){ $exclude = 'id_tag NOT IN('; $exclude .= $exid; $exclude .= ') AND '; } } $sql = 'SELECT * FROM `'._DB_PREFIX_.'smart_blog_tag` WHERE '.$exclude.' id_lang='.$id_lang.' AND name LIKE "%'.$query.'%" LIMIT '.$limit; $categories = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if(empty($categories)){ $this->content = ''; return;} foreach ( $categories as $cat ) { $this->content .= $cat['name'] . '|'; $this->content .= $cat['id_tag'] . "\n"; } } } public function get_tax_query( $query ) { $args = ! empty( $query ) ? array( 'search' => $query ) : array(); if ( ! empty( $this->exclude ) ) $args['exclude'] = $this->exclude; $tags = get_terms( VcLoopSettings::getTaxonomies(), $args ); foreach ( $tags as $tag ) { $this->content[] = array( 'value' => $tag->term_id, 'name' => $tag->name ); } } public function get_by_id( $query ) { $args = ! empty( $query ) ? array( 's' => $query, 'post_type' => 'any' ) : array( 'post_type' => 'any' ); if ( ! empty( $this->exclude ) ) $args['exclude'] = $this->exclude; $posts = get_posts( $args ); foreach ( $posts as $post ) { $this->content[] = array( 'value' => $post->ID, 'name' => $post->post_title ); } } public function render() { // echo json_encode( $this->content ); echo $this->content; } } /** * Build WP_Query object from query string. * String created by loop controllers * * @param $query * @return string */ function vc_build_loop_query( $query, $exclude_id = false ) { return VcLoopSettings::buildWpQuery( $query, $exclude_id ); } function vc_get_loop_suggestion() { // $loop_suggestions = new VcLoopSuggestions(vc_post_param('field'), vc_post_param('query'), vc_post_param('exclude')); $loop_suggestions = new VcLoopSuggestions(Tools::getValue('field'), Tools::getValue('q'), Tools::getValue('excludeIds')); $loop_suggestions->render(); die(); } function vc_get_loop_settings_json() { $loop_settings = new VcLoopSettings(vc_post_param('value'), vc_post_param('settings')); $loop_settings->render(); die(); } //add_action( 'wp_ajax_wpb_get_loop_suggestion', 'vc_get_loop_suggestion' ); // need to add ajax action //add_action('wp_ajax_wpb_get_loop_settings', 'vc_get_loop_settings_json'); JsComposer::$sds_action_hooks['wpb_get_loop_suggestion'] = 'vc_get_loop_suggestion'; JsComposer::$sds_action_hooks['wpb_get_loop_settings'] = 'vc_get_loop_settings_json'; function vc_loop_include_templates() { require_once vc_path_dir( 'TEMPLATES_DIR', 'params/loop/templates.html' ); } JsComposer::$sds_action_hooks['ps_admin_footer'] = 'vc_loop_include_templates'; //add_action('admin_footer', 'vc_loop_include_templates'); function vc_set_loop_default_value($param) { if ( empty( $param['value']) && isset($param['settings'])) { $param['value'] = VcLoopSettings::buildDefault( $param ); } return $param; } JsComposer::$sds_action_hooks['vc_mapper_attribute_loop'] = 'vc_set_loop_default_value'; //add_filter('vc_mapper_attribute_loop', 'vc_set_loop_default_value'); //find if any apply_filters found regarding with it. Then decide.