Ask your WordPress questions! Pay money and get answers fast! (more info)

Woocommerce have next/previous navigation with custom ordering WordPress

this code works perfect

<?php previous_post_link( 'Previous: %link', '%title', true, '','product_cat' ); ?>
<?php next_post_link( 'Next: %link', '%title', true, '', 'product_cat' ); ?>


but i want the ordering of the products to be the same with my woocommerce option.i have the custom ordering option.But at the navigation understands the date of products.

do you know how to change the ordering of the prev/next links?

Answers (2)

2015-11-30

Arnav Joy answers:

well I think you have to write custom code for it.

2015-12-01

Firoja_Imtosupport answers:

Hello,

In your file yourtheme/functions.php add these functions and make changes in query as you need

function next_post_link_product($format='%link &raquo;', $link='%title', $in_same_cat = false, $excluded_categories = '') {
adjacent_post_link_product($format, $link, $in_same_cat, $excluded_categories, false);
}

function previous_post_link_product($format='&laquo; %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;
}


Firoja_Imtosupport comments:

Let me know if anything is not understood


konstantinos monios comments:

i put your code at the functions.php and again the ordering is not changing.i want to have custom ordering at my products like the sorting i made at my products page


Firoja_Imtosupport comments:

There's a new plugin "WooCommerce Product Sort and Display" that may help you place your products in the order you want them.

Here's the link http://wordpress.org/plugins/woocommerce-product-sort-and-display/


Firoja_Imtosupport comments:

Also check https://docs.woothemes.com/document/custom-sorting-options-ascdesc/


konstantinos monios comments:

my problem is not the sorting.is the prev next at the single product.wors the navigation but with the wrong order