• 首页
  • 快讯
  • 专题
  • 商城
  • 导航
  • 圈子新
文章
文章商城快讯网址导航

{{userData.name}}已认证

文章

评论

关注

粉丝

¥{{role.user_data.money}}
{{role.user_data.credit}}
您已完成今天任务的
  • 私信列表所有往来私信

  • 财富管理余额、积分管理

  • 推广中心推广有奖励

    NEW
  • 任务中心每日任务

    NEW
  • 我的订单查看我的订单

  • 我的设置编辑个人资料

  • 进入后台管理

  • 资讯
  • 教程
    • 新手入门
    • 基础教程
    • 用户交互
    • 影音播放
    • 网站SEO
    • 后台定制
    • 商城相关
    • 网站安全
    • 网站维护
    • 开发教程
  • 主题
    • 自媒体主题
    • 下载站主题
    • 会员制主题
    • 淘宝客主题
    • 博客主题
    • CMS主题
    • 商城主题
    • 企业主题
    • 导航主题
    • 图片主题
    • 单页主题
  • 插件
    • 网站安全插件
    • 网站优化插件
    • 用户交互插件
    • 图片影音插件
    • 商城相关插件
    • 运维管理插件
    • 其他插件
  • 成品站上新
    • B2B营销模板
  • 视频
    • WordPress 新手入门
    • WooCommerce 开发指南
    • WordPress 主题开发核心知识
    • VPS/云服务器使用详解
    • 带你玩转Avada主题
    • SiteGround 主机使用教程
  • 商城
    • WordPress成品站模板
    • WordPress收费主题
    • WordPress收费插件
    • WordPress视频教程
    • WordPress付费服务
  • 多语言
  • 现用主题B2
    • 购买B2主题
    • B2主题使用教程
  • 下载WordPress
投稿
当前位置:首页>WordPress建站>WordPress开发>WordPress无刷新分类筛选以及分页的文章列表

WordPress无刷新分类筛选以及分页的文章列表

  • WordPress开发
  • 17年1月10日
  • 编辑
jsonvue

我们曾经讲了如何制作短码(查看),今天我们就通过短码实现一个带有无刷新动态分类筛选以及分页的文章列表。

该文章列表带有单选筛选功能,筛选条件可以是分类、标签或者其他自定义分类,采用ajax技术,文章列表可以通过数字分页。演示效果,猛戳这里>>>  该演示效果没有特定CSS修饰,需自行添加

1.编写短码函数

function jsonvue_filter_posts_sc($atts) {
    $a = shortcode_atts( array(
        'tax'      => 'category', //可以改为post_tag
        'terms'    => false, //排除某个分类
        'active'   => false, //设定默认加载哪个分类
        'per_page' => 12 //设定每页文章数量
    ), $atts );
    $result = NULL;
    $terms  = get_terms($a['tax']);
//排除某个分类就用下面一句,在短码添加terms='分类id'就可以排除
 //$terms = get_terms($a['tax'],array('exclude' =>$a['terms'])); 
    if (count($terms)) :
        ob_start(); ?>
            <div id="container-async" data-paged="<?php echo $a['per_page']; ?>" class="sc-ajax-filter">
                <ul class="nav-filter">
				<li>
                        <a href="#" data-filter="post_tag" data-term="all-terms" data-page="1">
                            所有
                        </a>
                    </li>
                    <?php foreach ($terms as $term) : ?>
                        <li<?php if ($term->term_id == $a['active']) :?> class="active"<?php endif; ?>>
                            <a href="<?php echo get_term_link( $term, $term->taxonomy ); ?>" data-filter="<?php echo $term->taxonomy; ?>" data-term="<?php echo $term->slug; ?>" data-page="1">
                                <?php echo $term->name; ?>
                            </a>
                        </li>
                    <?php endforeach; ?>
                </ul>

                <div class="status"></div>
                <div class="content"></div>
            </div>
        
        <?php $result = ob_get_clean();
    endif;
    return $result;
}

注册该短码:

add_shortcode( 'jsonvue_posts', 'jsonvue_ajax_posts_sc');

2.其他函数

第一步的短码函数并没有带有具体的处理逻辑,比如:发送ajax请求,php处理请求,分页数据等功能,那么现在我们就开始构建这些函数。

首先是 发送ajax请求的JS代码,这个是通过jquery实现。

$('#container-async').on('click', 'a[data-filter], .pagination a', function(event) {
            if(event.preventDefault) { event.preventDefault(); }

            $this = $(this);

        
            if ($this.data('filter')) {
                $this.closest('ul').find('.active').removeClass('active');
                $this.parent('li').addClass('active');
                $page = $this.data('page');
            }
            else {
              
                $page = parseInt($this.attr('href').replace(/\D/g,''));
                $this = $('.nav-filter .active a');
            }
            

            $params    = {
                'page' : $page,
                'tax'  : $this.data('filter'),
                'term' : $this.data('term'),
                'qty'  : $this.closest('#container-async').data('paged'),
            };

          
            get_posts($params);
        });
        
        $('a[data-term="all-terms"]').trigger('click');

Ajax请求后台php获取数据的JS代码

 function get_posts($params) {

            $container = $('#container-async');
            $content   = $container.find('.content');
                $status    = $container.find('.status');

            $status.text('正在加载 ...');

            $.ajax({
                        url: jsonvue.ajax_url,
                        data: {
                            action: 'do_filter_posts',
                    nonce: jsonvue.nonce,
                    params: $params
                        },
                        type: 'post',
                        dataType: 'json',
                        success: function(data, textStatus, XMLHttpRequest) {
                    
                            if (data.status === 200) {
                                $content.html(data.content);
                            }
                            else if (data.status === 201) {
                                $content.html(data.message);    
                            }
                            else {
                                $status.html(data.message);
                            }
                     },
                     error: function(MLHttpRequest, textStatus, errorThrown) {

                    $status.html(textStatus);
                    
                    /*console.log(MLHttpRequest);
                    console.log(textStatus);
                    console.log(errorThrown);*/
                     },
                complete: function(data, textStatus) {
                    
                    msg = textStatus;

                    if (textStatus === 'success') {
                        msg = data.responseJSON.found;
                    }

                    $status.text('已显示: ' + msg+'篇文章');
                    
                    /*console.log(data);
                    console.log(textStatus);*/
                }
            });
        }

php函数处理ajax请求

function jsonvue_filter_posts() {
    if( !isset( $_POST['nonce'] ) || !wp_verify_nonce( $_POST['nonce'], 'jsonvue' ) )
        die('Permission denied');
  
    $response = [
        'status'  => 500,
        'message' => '貌似有错误,请稍后再试 ...',
        'content' => false,
        'found'   => 0
    ];
    $tax  = sanitize_text_field($_POST['params']['tax']);
    $term = sanitize_text_field($_POST['params']['term']);
    $page = intval($_POST['params']['page']);
    $qty  = intval($_POST['params']['qty']);
    
    if (!term_exists( $term, $tax) && $term != 'all-terms') :
        $response = [
            'status'  => 501,
            'message' => '没找到分类',
            'content' => 0
        ];
        die(json_encode($response));
    endif;
    if ($term == 'all-terms') : 
        $tax_qry[] = [
            'taxonomy' => $tax,
            'field'    => 'slug',
            'terms'    => $term,
            'operator' => 'NOT IN'
        ];
    else :
        $tax_qry[] = [
            'taxonomy' => $tax,
            'field'    => 'slug',
            'terms'    => $term,
        ];
    endif;
    
    $args = [
        'paged'          => $page,
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'posts_per_page' => $qty,
        'tax_query'      => $tax_qry
    ];
    $qry = new WP_Query($args);
    ob_start();
        if ($qry->have_posts()) :
            while ($qry->have_posts()) : $qry->the_post(); ?>

                <article class="loop-item">
                    <header>
                        <h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                    </header>
                    <div class="entry-summary">
                        <?php the_excerpt(); ?>
                    </div>
                </article>

            <?php endwhile;
            
            jsonvue_ajax_pager($qry,$page);
            $response = [
                'status'=> 200,
                'found' => $qry->found_posts
            ];
            
        else :
            $response = [
                'status'  => 201,
                'message' => '没有文章'
            ];
        endif;
    $response['content'] = ob_get_clean();
    die(json_encode($response));
}
add_action('wp_ajax_do_filter_posts', 'jsonvue_filter_posts');
add_action('wp_ajax_nopriv_do_filter_posts', 'jsonvue_filter_posts');

分页函数:

function jsonvue_ajax_pager( $query = null, $paged = 1 ) {
    if (!$query)
        return;
    $paginate = paginate_links([
        'base'      => '%_%',
        'type'      => 'array',
        'total'     => $query->max_num_pages,
        'format'    => '#page=%#%',
        'current'   => max( 1, $paged ),
        'prev_text' => 'Prev',
        'next_text' => 'Next'
    ]);
    if ($query->max_num_pages > 1) : ?>
        <ul class="pagination">
            <?php foreach ( $paginate as $page ) :?>
                <li><?php echo $page; ?></li>
            <?php endforeach; ?>
        </ul>
    <?php endif;
}

最后,将上述代码整合,并加载进wordpress :

function assets() {
    wp_enqueue_script( 'bootcdn', 'http://cdn.bootcss.com/jquery/2.2.3/jquery.min.js">' ); 
 wp_enqueue_script('jsonvue/js', get_template_directory_uri().'/js/custom.js');
    //php想向js传递变量
    wp_localize_script( 'jsonvue/js', 'jsonvue', array(
        'nonce'    => wp_create_nonce( 'jsonvue' ),//ajax请求安全处理
        'ajax_url' => admin_url( 'admin-ajax.php' )//调用wordpress自带ajax处理程序
    ));
}
add_action('wp_enqueue_scripts', 'assets', 100);

注意:上述代码除了js文件,都要放在主题文件夹下function.php文件里面,默认短码调用方式:

[jsonvue_posts]

可配置属性有:

‘tax’ => ‘post_tag’, // 分类方式 category 或者post_tag
‘terms’ => false, // 自定义分类比如排除某个分类
‘active’ => false, //默认加载分类默认加载全部分类
‘per_page’ => 12 // 每页显示文章数,

另外,该代码运行需要PHP5.4或者以上环境。

源码下载:code

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
分类分类列表分类筛选
欢迎关注WordPress大学公众号 WPDAXUE
WordPress开发

WordPress 检查一篇文章是否存在

2016-9-9 9:56:39

WordPress开发

给WordPress的文章添加自定义文章状态

2018-7-27 8:35:36

猜你喜欢

WordPress分类存档页添加子分类选择列表

20年5月2日51.6k

WordPress 为当前文章在【分类】小工具中的所属分类添加current-cat类名

21年4月17日21.1k

WordPress代码 之 获取WordPress所有分类名字和ID

12年10月13日1116.8k

自定义WordPress分类排序 Custom Taxonomy Order

20年10月25日02.5k
1 条回复 A文章作者 M管理员

您必须登录或注册以后才能发表评论

  1. 希腊老爷
    希腊老爷 学前班lv0
    18年1月6日

    …

关于作者

jsonvue

小学生lv1

文章

1

评论

0

关注

0

粉丝

0
[文章] WordPress无刷新分类筛选以及分页的文章列表
Ta的全部动态

最新文章

  • 1

    WordPress 存储库的替代品来了:FAIR 包管理器——它到底是什么?

    6月9日
  • 2

    完整攻略:如何导入 WooCommerce 产品

    6月7日
  • 3

    WordPress.com 推出 AI 驱动的网站构建器

    6月6日
  • 4

    人工智能(AI)与 WordPress:2025 年及以后的未来

    6月6日
  • 5

    什么是视图转换?了解一下 WordPress 新插件 View Transitions

    6月6日

最新评论

PREVNEXT
  • 来自:

热门推荐

  • 家具家电产品商城模板 B2C003

    家具家电产品商城模板 B2C003

    ¥ 880
  • 时尚内衣泳装产品营销模板 B2B008

    时尚内衣泳装产品营销模板 B2B008

    ¥ 680
  • 户外运动产品营销模板 B2B012

    户外运动产品营销模板 B2B012

    ¥ 680
  • 时尚服装服饰产品商城模板 B2C004

    时尚服装服饰产品商城模板 B2C004

    ¥ 880
  • 儿童用品童装玩具营销模板 B2B019

    儿童用品童装玩具营销模板 B2B019

    ¥ 680
  • 厨卫产品营销模板 B2B027

    厨卫产品营销模板 B2B027

    ¥ 680
  • 多合一在线客服插件 Online Contact Widget

    多合一在线客服插件 Online Contact Widget

    ¥ 149
  • 厨具小家电产品营销模板 B2B020

    厨具小家电产品营销模板 B2B020

    ¥ 680
❯
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
  • 扫码打开当前页

  • 微信扫一扫,联系我们

  • 关注微信公众号 WPDAXUE

返回顶部
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分

今日签到

连续签到

  • {{item.credit}}
  • 连续{{item.count}}天
查看所有
我的优惠劵
  • ¥优惠劵
    使用时效:无法使用
    使用时效:

    之前

    使用时效:永久有效
    优惠劵ID:
    ×
    限制以下商品使用: 限制以下商品分类使用: 不限制使用:
    [{{ct.name}}]
    所有商品和商品类型均可使用
没有优惠劵可用!

购物车
  • ×
    删除
购物车空空如也!

清空购物车 前往结算
您有新的私信
没有新私信
写新私信 查看全部

专业提供WordPress网站建设,主题和插件开发、汉化、安装等服务

微信扫一扫联系我们

查看所有服务项目

关于本站

WordPress大学创建于2012年10月,专注于 WordPress建站教学和WordPress资源分享。我们希望通过努力,让更多人了解WordPress这个全世界最流行的建站程序,让每个人都能用好WordPress!

帮助中心

  • 关于我们
  • 服务项目
  • 付款方式
  • 发票开具
  • 广告投放
  • 服务条款
  • 推广返现

服务器推荐

  • 阿里云
  • 腾讯云
  • SiteGround(外贸)

关注交流

微信公众号WPDAXUE

微信公众号
WPDAXUE

微信扫一扫,长按识别二维码加群

微信扫一扫
长按识别入群

QQ扫描加群 287891283

QQ扫描加群
287891283

© 2012-2025 玉林市沃鹏网络科技有限公司・基于 WordPress
・桂ICP备2022005949号-1 ・营业执照
首页专题圈子
商城菜单我的