Created
June 10, 2020 14:39
-
-
Save premanshup/6c12cb0e921d4d44beee13230f138358 to your computer and use it in GitHub Desktop.
Display WooCommerce Single Products in same category.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function astra_next_post_link_product($format='%link »', $link='%title', $in_same_cat = false, $excluded_categories = '') { | |
adjacent_post_link_product($format, $link, $in_same_cat, $excluded_categories, false); | |
} | |
function astra_previous_post_link_product($format='« %link', $link='%title', $in_same_cat = false, $excluded_categories = '') { | |
adjacent_post_link_product($format, $link, $in_same_cat, $excluded_categories, true); | |
} | |
function adjacent_post_link_product( $format, $link, $in_same_cat = false, $excluded_categories = '', $previous = true ) { | |
if ( $previous && is_attachment() ) | |
$post = get_post( get_post()->post_parent ); | |
else | |
$post = get_adjacent_post_product( $in_same_cat, $excluded_categories, $previous ); | |
if ( ! $post ) { | |
$output = ''; | |
} else { | |
$title = $post->post_title; | |
if ( empty( $post->post_title ) ) | |
$title = $previous ? __( 'Previous Post' ) : __( 'Next Post' ); | |
$title = apply_filters( 'the_title', $title, $post->ID ); | |
$date = mysql2date( get_option( 'date_format' ), $post->post_date ); | |
$rel = $previous ? 'prev' : 'next'; | |
$string = '<a href="' . get_permalink( $post ) . '" rel="'.$rel.'">'; | |
$inlink = str_replace( '%title', $title, $link ); | |
$inlink = str_replace( '%date', $date, $inlink ); | |
$inlink = $string . $inlink . '</a>'; | |
$output = str_replace( '%link', $inlink, $format ); | |
} | |
$adjacent = $previous ? 'previous' : 'next'; | |
echo apply_filters( "{$adjacent}_post_link", $output, $format, $link, $post ); | |
} | |
function get_adjacent_post_product( $in_same_cat = false, $excluded_categories = '', $previous = true ) { | |
global $wpdb; | |
if ( ! $post = get_post() ) | |
return null; | |
$current_post_date = $post->post_date; | |
$join = ''; | |
$posts_in_ex_cats_sql = ''; | |
if ( $in_same_cat || ! empty( $excluded_categories ) ) { | |
$join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id"; | |
if ( $in_same_cat ) { | |
if ( ! is_object_in_taxonomy( $post->post_type, 'product_cat' ) ) | |
return ''; | |
$cat_array = wp_get_object_terms($post->ID, 'product_cat', array('fields' => 'ids')); | |
if ( ! $cat_array || is_wp_error( $cat_array ) ) | |
return ''; | |
$join .= " AND tt.taxonomy = 'product_cat' AND tt.term_id IN (" . implode(',', $cat_array) . ")"; | |
} | |
$posts_in_ex_cats_sql = "AND tt.taxonomy = 'product_cat'"; | |
if ( ! empty( $excluded_categories ) ) { | |
if ( ! is_array( $excluded_categories ) ) { | |
// back-compat, $excluded_categories used to be IDs separated by " and " | |
if ( strpos( $excluded_categories, ' and ' ) !== false ) { | |
_deprecated_argument( __FUNCTION__, '3.3', sprintf( __( 'Use commas instead of %s to separate excluded categories.' ), "'and'" ) ); | |
$excluded_categories = explode( ' and ', $excluded_categories ); | |
} else { | |
$excluded_categories = explode( ',', $excluded_categories ); | |
} | |
} | |
$excluded_categories = array_map( 'intval', $excluded_categories ); | |
if ( ! empty( $cat_array ) ) { | |
$excluded_categories = array_diff($excluded_categories, $cat_array); | |
$posts_in_ex_cats_sql = ''; | |
} | |
if ( !empty($excluded_categories) ) { | |
$posts_in_ex_cats_sql = " AND tt.taxonomy = 'product_cat' AND tt.term_id NOT IN (" . implode($excluded_categories, ',') . ')'; | |
} | |
} | |
} | |
$adjacent = $previous ? 'previous' : 'next'; | |
$op = $previous ? '<' : '>'; | |
$order = $previous ? 'DESC' : 'ASC'; | |
$join = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_cat, $excluded_categories ); | |
$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_date, $post->post_type), $in_same_cat, $excluded_categories ); | |
$sort = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" ); | |
$query = "SELECT p.id FROM $wpdb->posts AS p $join $where $sort"; | |
$query_key = 'adjacent_post_' . md5($query); | |
$result = wp_cache_get($query_key, 'counts'); | |
if ( false !== $result ) { | |
if ( $result ) | |
$result = get_post( $result ); | |
return $result; | |
} | |
$result = $wpdb->get_var( $query ); | |
if ( null === $result ) | |
$result = ''; | |
wp_cache_set($query_key, $result, 'counts'); | |
if ( $result ) | |
$result = get_post( $result ); | |
return $result; | |
} | |
add_action('wp' , 'remove_prev_next' , 50 ); | |
function remove_prev_next(){ | |
remove_action( 'woocommerce_single_product_summary', array( ASTRA_Ext_WooCommerce_Markup::get_instance(), 'next_previous_links' ), 1, 0 ); | |
} | |
add_action('wp' , 'add_prev_next' , 100 ); | |
function add_prev_next(){ | |
if ( 'disable' != astra_get_option( 'single-product-nav-style' ) ) { | |
add_action( 'woocommerce_single_product_summary', 'next_previous_links_custom' , 1, 0 ); | |
function next_previous_links_custom(){ | |
if ( ! is_product() ) { | |
return; | |
} | |
?> | |
<div class="product-links"> | |
<?php astra_previous_post_link_product('%link', '<i class="ast-icon-previous"></i>', true); ?> | |
<?php astra_next_post_link_product('%link', '<i class="ast-icon-next"></i>', true); ?> | |
</div> | |
<?php | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment