2013-04-12 87 views

回答

10
<?php previous_post_link_product('%link', '&laquo; Anterior: %title', true); ?> 
<?php next_post_link_product('%link', 'Siguiente: %title &raquo;', true); ?> 

在您的文件yourtheme/functions.php中添加这些功能

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; 
} 
+0

感谢。作品。应该是选择的解决方案。 –

1

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

说明

使用WordPress的previous_post_linknext_post_link将工作。事实上,你几乎在那里。

除了设置true作为第三个参数($ in_same_term),确保分类中的名字也传递的最后一个参数($分类)。对于WooCommerce,默认产品类别是product_cat

有一点需要注意,这些功能将获得匹配任何条款的下一个/以前的产品。通过将术语id(s)作为第四个参数($ exclude_terms),可以排除术语。

参考

https://developer.wordpress.org/reference/functions/previous_post_link/ https://developer.wordpress.org/reference/functions/next_post_link/

<?php previous_post_link($format, $link, $in_same_term = false, $excluded_terms = '', $taxonomy = 'category'); ?> 
<?php next_post_link($format, $link, $in_same_term = false, $excluded_terms = '', $taxonomy = 'category'); ?> 
+0

没有为我工作: '<?php next_post_link('%link','%title',$ in_same_term = true,$ excluded_terms ='',$ taxonomy ='category'); ?> – Ben

+1

WooCommerce产品的分类是'product_cat'。 @Ben – Blaine

+0

谢谢,我的坏! – Ben

1

Edgardos解决办法是让我一个真棒出发点。

但是,它假设产品是按post_date排序的。通常menu_order应该有更高的排序优先级。

因此,我改变: $current_post_date = $post->post_date;

分为: $current_post_menu_order = $post->menu_order;

而且$哪里使用p.menu_order/$ current_post_menu_order:

$where = apply_filters("get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.menu_order $op %s AND p.post_type = %s AND p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_menu_order, $post->post_type), $in_same_cat, $excluded_categories);

相关问题