File "articles-query.php"
Full Path: /var/www/bvnghean.vn/save_bvnghean.vn/wp-content/plugins/sneeit-framework/includes/articles/articles-query.php
File size: 9.1 KB
MIME-type: text/x-php
Charset: utf-8
<?php
add_filter('sneeit_articles_query', 'sneeit_articles_query');
function sneeit_articles_query($args = array()) {
$paged = 1;
$count = 5;
// main elements
if (!empty($args['count']) && is_numeric($args['count'])) {
$count = (int) $args['count'];
}
if (!empty($args['paged']) && is_numeric($args['paged'])) {
$paged = (int) $args['paged'];
}
global $Sneeit_Articles_Loaded_Posts;
if ($Sneeit_Articles_Loaded_Posts == null) {
$Sneeit_Articles_Loaded_Posts = array();
}
if (!empty($args['count'])) :
if (empty($args['sneeit_query_vars'])) {
// VALIDATE INFORMATION
$args = wp_parse_args($args, array(
'count' => 5,
'post_view_count_meta_key' => SNEEIT_KEY_POST_VIEW_COUNT,
'post_review_average_meta_key' => SNEEIT_KEY_POST_REVIEW_AVERAGE,
'article_display_callback' => '',
));
if (empty($args['article_display_callback']) || !function_exists($args['article_display_callback'])) {
return;
}
// PREPARING QUERY ARGUMENTS TO LOAD
$query_vars = array();
// - basic things
$query_vars['post_type'] = 'post';
$query_vars['post_status'] = 'publish';
$query_vars['posts_per_page'] = $count;
$query_vars['paged'] = $paged;
if (!empty($args['ignore_sticky_posts'])) {
$query_vars['ignore_sticky_posts'] = true;
}
if (!empty($args['exclude_loaded_posts'])) {
if (!empty($args['post__not_in'])) {
$query_vars['post__not_in'] = $args['post__not_in'];
} else if (!empty($Sneeit_Articles_Loaded_Posts)) {
$query_vars['post__not_in'] = $Sneeit_Articles_Loaded_Posts;
}
}
// - order for loading posts
if (!empty($args['orderby'])) {
switch ($args['orderby']) {
case 'popular':
$query_vars['meta_key'] = $args['post_view_count_meta_key'];
$query_vars['orderby'] = 'meta_value_num';
break;
case 'comment':
$query_vars['orderby'] = 'comment_count';
break;
case 'random':
$query_vars['orderby'] = 'rand';
break;
case 'latest-review':
$query_vars['meta_key'] = $args['post_review_average_meta_key'];
break;
case 'random-review':
$query_vars['meta_key'] = $args['post_review_average_meta_key'];
$query_vars['orderby'] = 'rand';
break;
case 'popular-review':
$query_vars['meta_key'] = $args['post_review_average_meta_key'];
$query_vars['orderby'] = 'meta_value_num';
break;
case 'random-related':
$query_vars['orderby'] = 'rand';
break;
case 'popular-related':
$query_vars['meta_key'] = $args['post_view_count_meta_key'];
$query_vars['orderby'] = 'meta_value_num';
break;
}
}
// - categories
if (!empty($args['categories'])) {
$query_vars['category__in'] = explode(',', $args['categories']);
}
// -- exclude categories if user selected
if (!empty($args['exclude_categories'])) {
$query_vars['category__not_in'] = explode(',', $args['exclude_categories']);
}
// - tags
if (!empty($args['tags'])) {
$query_vars['tag__in'] = explode(',', $args['tags']);
}
// -- exclude tags if user selected
if (!empty($args['exclude_tags'])) {
$query_vars['tag__not_in'] = explode(',', $args['exclude_tags']);
}
// - append related category and tag here
if (!empty($args['orderby']) &&
strpos($args['orderby'], 'related') !== false ) {
if (!is_single() && !is_admin()) {
return;
}
unset($query_vars['tag__in']);
unset($query_vars['category__in']);
$post_id = get_the_ID();
if (empty($query_vars['post__not_in'])) {
$query_vars['post__not_in'] = array();
}
array_push($query_vars['post__not_in'], $post_id);
// we will check with the tag first
// if has a tag larger than count (priority smaller tag), we will select that tags only
$tags = wp_get_post_tags($post_id, array('fields' => 'all'));
$tag_max = -1;
$tag_id = 0;
foreach ($tags as $tag) {
// check if this tag was excluded
if (!empty($query_vars['tag__not_in']) &&
in_array($tag->term_id, $query_vars['tag__not_in'])) {
continue;
}
// now we can save data
if ($tag->count > $tag_max && $tag_max < $count) {
$tag_max = $tag->count;
$tag_id = $tag->term_id;
}
}
if ($tag_max >= $count) {
$query_vars['tag__in'] = array($tag_id);
}
/* if has no tag larger than count, we will get categories to check */
else {
$cats = wp_get_post_categories($post_id, array('fields' => 'all'));
$cat_max = -1;
$cat_id = 0;
foreach ($cats as $cat) {
// check if this category was excluded
if (!empty($query_vars['category__not_in']) &&
in_array($cat->term_id, $query_vars['category__not_in'])) {
continue;
}
// now we can save data
if ($cat->count > $cat_max && $cat_max < $count) {
$cat_max = $cat->count;
$cat_id = $cat->term_id;
}
}
// found a cat has count > count
// or not but the max cat > max tag
if ($cat_max >= $count || $tag_max < $cat_max) {
$query_vars['category__in'] = array($cat_id);
}
/* if has no cate larger than count, we will pick the biggest count from tag / category */
else if ($tag_max > 0) {
$query_vars['tag__in'] = array($tag_id);
}
}
}
// authors
if (!empty($args['authors'])) {
$query_vars['author'] = $args['authors'];
}
if (!empty($args['exclude_authors'])) {
$query_vars['author__not_in'] = explode(',', $args['exclude_authors']);
}
// duration to load posts from
if (!empty($args['duration']) &&
in_array($args['duration'], array(
'1 year ago',
'1 month ago',
'1 week ago'
))
) {
$query_vars['date_query'] = array(
array(
'column' => 'post_date_gmt',
'after' => $args['duration'],
)
);
}
} /* empty($args['sneeit_query_vars']) */
/* we are serving a default query */
else {
$query_vars = $args['sneeit_query_vars'];
$query_vars['post_status'] = 'publish';
if (!empty($args['paged'])) {
$query_vars['paged'] = $paged;
}
}
// loading entries
$items = new WP_Query( $query_vars );
else: /* count=0, may be archive pages, so we use default query */
global $wp_query;
$items = $wp_query;
if (!empty($wp_query->query_vars['paged'])) {
$paged = (int) $wp_query->query_vars['paged'];
$args['paged'] = $paged;
}
if (!empty($wp_query->query_vars['posts_per_page'])) {
$count = (int) $wp_query->query_vars['posts_per_page'];
}
// customize $args for related functions
$args['count'] = $count;
$args['sneeit_query_vars'] = $wp_query->query_vars;
endif;
// loop and fill content
if (isset($args['index']) && is_numeric($args['index'])) {
$index = (int) $args['index'];
} else {
$index = ($paged - 1) * $count;
}
// return html
$html = '';
if ($items->have_posts()) :
$processed_args = wp_parse_args($args, array(
// META KEYS
'post_feature_media_meta_key' => SNEEIT_KEY_POST_FEATURE_MEDIA,
'post_view_count_meta_key' => SNEEIT_KEY_POST_VIEW_COUNT,
'post_review_average_meta_key' => SNEEIT_KEY_POST_REVIEW_AVERAGE,
'post_review_type_meta_key' => SNEEIT_KEY_POST_REVIEW_TYPE,
// THUMBNAIL
'default_thumb' => '',
'thumb_height' => 150,
'auto_thumb' => false,
'thumb_img_attr' => array(),
'format_icon_map' => array(
'aside' => '',
'chat' => '',
'gallery' => '',
'link' => '',
'image' => '',
'quote' => '',
'status' => '',
'video' => '<i class="fa fa-play-circle-o"></i> ',
'audio' => ''
),
// DECORATION
'before_view_count' => '<i class="fa fa-eye"></i> ',
'after_view_count' => '',
'before_author_name' => '',
'after_author_name' => '',
'before_comment_count' => '<i class="fa fa-commenting"></i> ',
'after_comment_count' => '',
'before_date_time' => '<i class="fa fa-clock-o"></i> ',
'after_date_time' => '',
'before_read_more' => '',
'after_read_more' => ' <i class="fa fa-chevron-circle-right"></i>',
// TRANSLATE
'%s ago' => esc_html__('%s ago', 'sneeit'),
'Read More' => esc_html__('Read More', 'sneeit'),
// CLASS and SELECTOR
'item_extra_class' => ''
));
while ( $items->have_posts() ) : $items->the_post();
// update loaded post list
global $Sneeit_Articles_Loaded_Posts;
if (is_array($Sneeit_Articles_Loaded_Posts)) {
array_push($Sneeit_Articles_Loaded_Posts, get_the_ID());
}
// process and display article
$item = new Sneeit_Articles_Query_Item($processed_args, $index);
$html .= call_user_func($args['article_display_callback'], $item);
// update index
$index++;
endwhile;
endif;
wp_reset_postdata();
// provide a hook, so ppl can use this to create paginaiton for example
// or any other apps for their block base on arguments
if (!empty($args['block_id'])) {
$data = apply_filters('sneeit_articles_query_args', array(
'args' => $args,
'found_posts' => $items->found_posts,
'loaded_posts' => $Sneeit_Articles_Loaded_Posts
));
if (is_string($data)) {
$html .= $data;
}
}
return $html;
}