'post_tag',
'post_type' => 'post',
'number' => 5,
'order' => 'count-desc',
'format' => 'list',
'separator' => '',
'include_page' => 'true',
'exclude_posts' => '',
'exclude_terms' => '',
'post_id' => 0,
'excerpt_wrap' => 55,
'limit_days' => 0,
'min_shared' => 1,
'title' => __( '
Related posts
', 'simpletags' ),
'nopoststext' => __( 'No related posts.', 'simpletags' ),
'dateformat' => get_option( 'date_format' ),
'xformat' => __( '%post_title% (%post_comment%)', 'simpletags' )
);
// Get values in DB
$defaults['number'] = $options['rp_limit_qty'];
$defaults['order'] = $options['rp_order'];
$defaults['nopoststext'] = $options['rp_notagstext'];
$defaults['title'] = $options['rp_title'];
$defaults['xformat'] = $options['rp_xformat'];
$defaults['taxonomy'] = $options['rp_taxonomy'];
if ( empty( $user_args ) ) {
$user_args = $options['rp_adv_usage'];
}
// Replace old markers by new
$markers = array(
'%date%' => '%post_date%',
'%permalink%' => '%post_permalink%',
'%title%' => '%post_title%',
'%commentcount%' => '%post_comment%',
'%tagcount%' => '%post_tagcount%',
'%postid%' => '%post_id%'
);
if ( ! is_array( $user_args ) ) {
$user_args = strtr( $user_args, $markers );
}
$args = wp_parse_args( $user_args, $defaults );
extract( $args );
// If empty use default xformat !
if ( empty( $xformat ) ) {
$xformat = $defaults['xformat'];
}
// Clean memory
$args = array();
$defaults = array();
// Get current post data
$object_id = (int) $post_id;
if ( $object_id == 0 ) {
global $post;
$object_id = (int) $post->ID;
if ( $object_id == 0 ) {
return false;
}
}
// Get cache if exist
$results = false;
// Generate key cache
$key = md5( maybe_serialize( $user_args ) . '-' . $object_id );
if ( $cache = wp_cache_get( 'related_posts' . $taxonomy, 'simpletags' ) ) {
if ( isset( $cache[ $key ] ) ) {
$results = $cache[ $key ];
}
}
// If cache not exist, get datas and set cache
if ( $results === false || $results === null ) {
// Get get tags
$current_terms = get_the_terms( (int) $object_id, $taxonomy );
if ( $current_terms == false || is_wp_error( $current_terms ) ) {
return SimpleTags_Client::output_content( 'st-related-posts', $format, $title, $nopoststext, $copyright );
}
// Number - Limit
$number = (int) $number;
if ( $number == 0 ) {
$number = 5;
} elseif ( $number > 50 ) {
$number = 50;
}
$limit_sql = 'LIMIT 0, ' . $number;
unset( $number );
// Order tags before output (count-asc/count-desc/date-asc/date-desc/name-asc/name-desc/random)
$order_by = '';
$order = strtolower( $order );
switch ( $order ) {
case 'count-asc':
$order_by = 'counter ASC, p.post_title DESC';
break;
case 'random':
$order_by = 'RAND()';
break;
case 'date-asc':
$order_by = 'p.post_date ASC';
break;
case 'date-desc':
$order_by = 'p.post_date DESC';
break;
case 'name-asc':
$order_by = 'p.post_title ASC';
break;
case 'name-desc':
$order_by = 'p.post_title DESC';
break;
default: // count-desc
$order_by = 'counter DESC, p.post_title DESC';
break;
}
// Limit days - 86400 seconds = 1 day
$limit_days = (int) $limit_days;
$limit_days_sql = '';
if ( $limit_days != 0 ) {
$limit_days_sql = 'AND p.post_date > "' . date( 'Y-m-d H:i:s', time() - $limit_days * 86400 ) . '"';
}
unset( $limit_days );
// Make array post type
if ( is_string( $post_type ) ) {
$post_type = explode( ',', $post_type );
}
// Include_page
$include_page = strtolower( $include_page );
if ( $include_page == 'true' ) {
$post_type[] = 'page';
}
unset( $include_page );
// Build post type SQL
$restrict_sql = "AND p.post_type IN ('" . implode( "', '", $post_type ) . "')";
// Restrict posts
$exclude_posts_sql = '';
if ( $exclude_posts != '' ) {
$exclude_posts = (array) explode( ',', $exclude_posts );
$exclude_posts = array_unique( $exclude_posts );
$exclude_posts_sql = "AND p.ID NOT IN (";
foreach ( $exclude_posts as $value ) {
$value = (int) $value;
if ( $value > 0 && $value != $object_id ) {
$exclude_posts_sql .= '"' . $value . '", ';
}
}
$exclude_posts_sql .= '"' . $object_id . '")';
} else {
$exclude_posts_sql = "AND p.ID <> {$object_id}";
}
unset( $exclude_posts );
// Restricts tags
$terms_to_exclude = array();
if ( $exclude_terms != '' ) {
$exclude_terms = (array) explode( ',', $exclude_terms );
$exclude_terms = array_unique( $exclude_terms );
foreach ( $exclude_terms as $value ) {
$terms_to_exclude[] = trim( $value );
}
}
unset( $exclude_terms );
// SQL Terms list
$term_list = array();
foreach ( (array) $current_terms as $term ) {
if ( ! in_array( $term->name, $terms_to_exclude ) ) {
$term_list[] = '"' . (int) $term->term_id . '"';
}
}
$term_list = implode( ', ', $term_list );
// Build SQL terms subqueries array
$include_terms_sql = array();
if ( ! empty( $term_list ) ) {
$include_terms_sql[ $taxonomy ] = $term_list;
}
// Group Concat check if post_relatedtags is used by xformat...
$select_gp_concat = '';
if ( strpos( $xformat, '%post_relatedtags%' ) || $min_shared > 1 ) {
$select_gp_concat = ', GROUP_CONCAT(tt.term_id) as terms_id';
}
// Check if post_excerpt is used by xformat...
$select_excerpt = '';
//if ( strpos( $xformat, '%post_excerpt%' ) ) {
// $select_excerpt = ', p.post_content, p.post_excerpt, p.post_password';
//}
// If empty return no posts text
if ( empty( $include_terms_sql ) ) {
return SimpleTags_Client::output_content( 'st-related-posts', $format, $title, $nopoststext, $copyright );
}
// Posts: title, comments_count, date, permalink, post_id, counter
$results = $wpdb->get_results( "
SELECT p.*, COUNT(tr.object_id) AS counter {$select_excerpt} {$select_gp_concat}
FROM {$wpdb->posts} AS p
INNER JOIN {$wpdb->term_relationships} AS tr ON (p.ID = tr.object_id)
INNER JOIN {$wpdb->term_taxonomy} AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
WHERE 1 = 1
AND (tt.taxonomy = '{$taxonomy}' AND tt.term_id IN ({$term_list}))
{$exclude_posts_sql}
AND p.post_status = 'publish'
AND p.post_date_gmt < '" . current_time( 'mysql' ) . "'
{$limit_days_sql}
{$restrict_sql}
GROUP BY tr.object_id
ORDER BY {$order_by}
{$limit_sql}" );
$cache[ $key ] = $results;
wp_cache_set( 'related_posts' . $taxonomy, $cache, 'simpletags' );
}
if ( $format == 'object' || $format == 'array' ) {
return $results;
} elseif ( $results === false || empty( $results ) ) {
return SimpleTags_Client::output_content( 'st-related-posts', $format, $title, $nopoststext, $copyright );
}
if ( empty( $dateformat ) ) {
$dateformat = get_option( 'date_format' );
}
$output = array();
// Replace placeholders
foreach ( (array) $results as $result ) {
if ( ( $min_shared > 1 && ( count( explode( ',', $result->terms_id ) ) < $min_shared ) ) || ! is_object( $result ) ) {
continue;
}
$element_loop = $xformat;
$post_title = apply_filters( 'the_title', $result->post_title );
$element_loop = str_replace( '%post_date%', mysql2date( $dateformat, $result->post_date ), $element_loop );
$element_loop = str_replace( '%post_permalink%', get_permalink( $result ), $element_loop );
$element_loop = str_replace( '%post_title%', $post_title, $element_loop );
$element_loop = str_replace( '%post_title_attribute%', esc_html( strip_tags( $post_title ) ), $element_loop );
$element_loop = str_replace( '%post_comment%', (int) $result->comment_count, $element_loop );
$element_loop = str_replace( '%post_tagcount%', (int) $result->counter, $element_loop );
$element_loop = str_replace( '%post_id%', $result->ID, $element_loop );
if ( isset( $result->terms_id ) ) {
$element_loop = str_replace( '%post_relatedtags%', self::get_tags_from_id( $result->terms_id, $taxonomy ), $element_loop );
}
if ( isset( $result->post_excerpt ) || isset( $result->post_content ) ) {
$element_loop = str_replace( '%post_excerpt%', self::get_excerpt_post( $result->post_excerpt, $result->post_content, $result->post_password, $excerpt_wrap ), $element_loop );
}
$output[] = $element_loop;
}
// Clean memory
$results = array();
unset( $results, $result );
return SimpleTags_Client::output_content( 'st-related-posts', $format, $title, $output, $copyright, $separator );
}
/**
* Build excerpt from post data with specific lenght
*
* @param string $excerpt
* @param string $content
* @param string $password
* @param integer $excerpt_length
*
* @return string
* @author Amaury Balmer
*/
public static function get_excerpt_post( $excerpt = '', $content = '', $password = '', $excerpt_length = 55 ) {
if ( ! empty( $password ) ) { // if there's a password
if ( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] != $password ) { // and it doesn't match the cookie
return __( 'There is no excerpt because this is a protected post.', 'simpletags' );
}
}
if ( ! empty( $excerpt ) ) {
return apply_filters( 'get_the_excerpt', $excerpt );
} else { // Fake excerpt
$content = str_replace( ']]>', ']]>', $content );
$content = strip_tags( $content );
$excerpt_length = (int) $excerpt_length;
if ( $excerpt_length == 0 ) {
$excerpt_length = 55;
}
$words = explode( ' ', $content, $excerpt_length + 1 );
if ( count( $words ) > $excerpt_length ) {
array_pop( $words );
array_push( $words, '[...]' );
$content = implode( ' ', $words );
}
return $content;
}
}
/**
* Get and format tags from list ID (SQL Group Concat)
*
* @param string $terms
*
* @return string
* @author Amaury Balmer
*/
public static function get_tags_from_id( $terms = '', $taxonomy = 'post_tag' ) {
if ( empty( $terms ) ) {
return '';
}
// Get tags since Term ID.
$terms = (array) get_terms( $taxonomy, 'include=' . $terms );
if ( empty( $terms ) ) {
return '';
}
// HTML Rel (tag)
$rel = SimpleTags_Client::get_rel_attribut();
$output = array();
foreach ( (array) $terms as $term ) {
$link = get_term_link( $term->term_id, $term->taxonomy );
if ( empty( $link ) || is_wp_error( $link ) ) {
continue;
}
$output[] = '' . esc_html( $term->name ) . '';
}
return implode( ', ', $output );
}
}