单个产品页面上的WooCommerce分页 - 但仅限于父类别

时间:2014-12-17 09:48:41

标签: php wordpress pagination woocommerce woothemes

我想在WooCommerce的每个产品页面上添加分页,以便用户可以在该类别的产品之间移动,而不必每次都返回主类别页面。

我知道可以使用标准的WordPress分页链接,例如......

<?php previous_post_link('&laquo; %link'); ?>
<?php next_post_link('%link &raquo;'); ?>

如果我想浏览所有产品,这是有效的,但我只想浏览我所属类别中的产品。有没有人知道如何限制此类产品,因此此类别以外的产品不是&#39包括在内?

我已尝试使用WordPress codex中提到的in_same_term参数来获取链接,仅显示下一个/上一个产品是否在同一类别中,但由于某种原因它返回一个整数。这是我使用的代码......

<?php next_post_link( '%link', '%title', TRUE, '' ); ?>

即使遵循Codex结构,它也不会返回任何内容。我也试过......

<?php next_post_link( '%link %title', TRUE, '' ); ?>

这就是我得到的回报......

1 %title

我难以接受下一步的去处。

1 个答案:

答案 0 :(得分:1)

这是我最近编写的一个功能,它也能完成这项工作并且非常灵活

想法:

首先需要获取当前的帖子ID,我通过get_queried_object_id()获得。帖子ID将用于检索:

  • 帖子所属的帖子术语wp_get_post_terms()。为了加快速度,只会返回条款的ID。将使用第一个ID(您可以在此处修改代码以确定如果帖子有多个术语将使用哪个术语),这将用于检索具有此确定性的所有帖子术语

  • 与此帖子直接相邻的帖子的帖子ID,以确定并检索此帖子中的下一个和上一个帖子

以上所有信息都将在tax_query get_posts中使用,以检索当前帖子中共享该字词的所有帖子。在该函数中,默认分类法为categorypost_type设置为any以获取具有此特定字词的所有帖子

同样,为了使代码更快并且资源安全,我们只会获得帖子ID,因为这就是所需要的所有

现在是代码的重要部分。我们现在需要确定以下内容:

  • 自定义get_posts查询中返回的帖子ID数组中当前帖子的当前位置。这里使用的函数是array_search

  • 如果此帖子之前或之后有帖子(下一篇或上一篇文章,则定义与功能next_post_link()previous_post_link() ),获取这些帖子的ID

  • 使用get_post的ID来检索当前帖子中的下一个和上一个帖子的标题

最后将返回链接。如果当前帖子是数组中的第一个或最后一个帖子并且没有下一个或上一个帖子,我已经设置了消息。你可以在这里决定你想做什么,以及重要的是,其余的代码

为了使代码更快更有效,我已经使用了Transient API,您可以进一步阅读。我还使用transition_post_status动作钩子来挂钩一个函数,以便在帖子的帖子状态发生变化时删除这些瞬态。这包括发布的新帖子,更新后的帖子以及删除后/取消删除的帖子

代码:

这是代码。这将进入你的functions.php

function get_post_link( $taxonomy = 'category', $post_type = [ 'any' ] ) {

    $id             = get_queried_object_id(); // Get the current post ID
    $transient_id   = 'post_number_' . md5( $id . $taxonomy . implode( ',', $post_type ) ); //Create a unique transient id

    if ( false === ( $links = get_transient( $transient_id ) ) ) {

        // Get the terms a post belongs to
        $terms = wp_get_post_terms( $id, $taxonomy, array( 'fields' => 'ids' ) ); 

        // Use a tax_query to get all posts from the given term
        // Just retrieve the ids to speed up the query
        $post_args = [ 
            'post_type'         => $post_type,
            'fields'            => 'ids',
            'posts_per_page'    => -1,
            'tax_query'         => [
                [
                    'taxonomy'          => $taxonomy,
                    'field'             => 'term_id',
                    'terms'             => $terms[0],
                    'include_children'  => false,
                ],
            ],

        ];

        // Get all the posts having the given term from all post types
        $q = get_posts( $post_args );

        //Get the current post position. Will be used to determine next/previous post
        $current_post_position = array_search( $id, $q );

        // Get the previous/older post ID
        if ( array_key_exists( $current_post_position + 1 , $q ) ) {
            $previous = $q[$current_post_position + 1];
        }

        // Get post title link to the previous post
        if( isset( $previous ) ) {
            $previous_post      = get_post( $previous );
            $previous_post_link = get_permalink( $previous );
            $previous_title     = '<a href="' . $previous_post_link . '">' . $previous_post->post_title . '</a></br>';
        }

        // Get the next/newer post ID
        if ( array_key_exists( $current_post_position - 1 , $q ) ) {
            $next = $q[$current_post_position - 1];
        }

        // Get post title link to the next post
        if( isset( $next ) ) {
            $next_post      = get_post( $next );
            $next_post_link = get_permalink( $next );
            $next_title     = '<a href="' . $next_post_link . '">' . $next_post->post_title . '</a></br>';?><pre><?php var_dump($next_title); ?></pre><?php 

        }

        // The returned post links 
        if( isset( $previous_title, $next_title ) ) {

            $links = [
                'previous_post' => $previous_title, 
                'next_post'     => $next_title, 
            ];

        }elseif( !isset( $previous_title ) && $next_title ) {

            $links = [
                'previous_post' => 'You are currently viewing the newest post', 
                'next_post'     => $next_title, 
            ];

        }elseif( $previous_title && !isset( $next_title ) ) {

            $links = [
                'previous_post' => $previous_title, 
                'next_post'     => 'You are currently viewing the last post', 
            ];

        }

        set_transient( $transient_id, $links, 7 * DAY_IN_SECONDS );
    }

    return (object)$links;
}

add_action( 'transition_post_status', function ( $new_status, $old_status, $post )
{

        global $wpdb;
        $wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE ('_transient%_post_number_%')" );
        $wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE ('_transient_timeout%_post_number_%')" );

}, 10, 3 );

如何使用:

现在,您可以在single.php中使用以下代码。默认分类法为category,帖子类型为any。如果您的自定义分类法称为mytax,则可以使用此类代码

if( function_exists( 'get_post_link' ) ) {          
    $post_links = get_post_link( 'mytax' );
    echo $post_links->previous_post . '</br>' . $post_links->next_post;
}