• https://dgpics.com/dev/

    Because woocommerce has it’s own content type “product” and it’s own category system, the previous_post_link and next_post_link were useless to me because our client wanted it to be able to navigate within the woocommerce categories.

    This accomplished our goal of navigation forward and backward within a woocommerce product category, but it is navigating by date published and I need it to navigate by alphabetical order like the thumbnails on the main category pages(ex. https://dgpics.com/dev/product-category/buy-music-photos/). Basically if you are on a category page and click on a product, and go to the single page, we need to have next/previous links that navigate in the order they were on the category page.

    Here is the code I’m using so far:

    function 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 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;
    }

    It gets called from my template with this:

    <?php previous_post_link_product('%link', '<button> Previous Photo: %title</button>', true); ?>
    <?php next_post_link_product('%link', '<button>Next Photo: %title</button>', true); ?>

    Any help would be greatly appreciated. I would even be open to someone I could hire to make this work.

Viewing 1 replies (of 1 total)
  • helensama

    (@helensama)

    Hi Did you get this to work? I am looking for this exact functionality and am surprised it’s not available as a plugin or somehow. Thanks!

Viewing 1 replies (of 1 total)
  • The topic ‘[Plugin: Woocommerce] Next/Previous Links’ is closed to new replies.