You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress:如何在functions.php中获取当前分类名称?

WordPress 基于分类的AJAX加载更多文章实现优化

原代码存在的问题

  • AJAX回调中get_query_var('cat')无法正确获取当前分类:AJAX请求是独立的HTTP请求,不会继承页面的查询变量,所以这个方式拿不到分类信息。
  • 注册的id查询变量未实际使用,属于冗余代码。
  • 使用category_name(分类别名)作为查询条件不够可靠,分类别名可能被修改,而分类ID是固定不变的。

修正后的实现方案

1. 调整functions.php中的代码

移除冗余的查询变量注册,修改AJAX回调逻辑,通过前端传递的分类ID来筛选文章:

function more_post_ajax() {
    // 验证请求合法性
    if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'load_more_nonce')) {
        wp_die('非法请求');
    }

    $ppp = isset($_POST["ppp"]) ? intval($_POST["ppp"]) : 1;
    $page = isset($_POST['pageNumber']) ? intval($_POST['pageNumber']) : 1;
    $category_id = isset($_POST['categoryId']) ? intval($_POST['categoryId']) : 0;

    header("Content-Type: text/html");

    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => $ppp,
        'paged'          => $page,
        'post_status'    => 'publish',
    );

    // 如果有分类ID,添加到查询条件
    if ($category_id > 0) {
        $args['cat'] = $category_id;
    }

    $loop = new WP_Query($args);

    $out = '';

    if ($loop->have_posts()) : 
        while ($loop->have_posts()) : $loop->the_post();
            $out .= '<div class="article_card">
                        <div class="article_card__thumbnail">' . get_the_post_thumbnail(null, 'medium') . '</div>
                        <div class="article_card__content">
                            <h3><a href="' . esc_url(get_the_permalink()) . '">' . esc_html(get_the_title()) . '</a></h3>
                            <p class="body-small">' . wp_trim_words(get_the_excerpt(), 60) . '</p>
                            <a href="' . esc_url(get_the_permalink()) . '"> Learn more →</a>
                        </div>
                    </div>';
        endwhile;
    endif;

    wp_reset_postdata();
    wp_die($out);
}
  
add_action('wp_ajax_nopriv_more_post_ajax', 'more_post_ajax');
add_action('wp_ajax_more_post_ajax', 'more_post_ajax');

// 注册并输出nonce,用于AJAX请求验证
function load_more_nonce() {
    wp_localize_script('jquery', 'load_more_params', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('load_more_nonce')
    ));
}
add_action('wp_enqueue_scripts', 'load_more_nonce');

2. 前端JS代码(添加到主题的JS文件或分类模板中)

在分类页面中,获取当前分类ID并传递给AJAX请求:

jQuery(document).ready(function($) {
    var page = 1;
    var ppp = 6; // 每页加载数量,可根据需求调整
    var categoryId = parseInt($('.load-more-container').data('category-id')); // 从页面元素获取分类ID

    $('.load-more-btn').on('click', function() {
        page++;

        $.ajax({
            url: load_more_params.ajax_url,
            type: 'POST',
            data: {
                action: 'more_post_ajax',
                nonce: load_more_params.nonce,
                ppp: ppp,
                pageNumber: page,
                categoryId: categoryId
            },
            beforeSend: function() {
                $('.load-more-btn').text('加载中...').prop('disabled', true);
            },
            success: function(response) {
                if (response) {
                    $('.articles-container').append(response);
                    $('.load-more-btn').text('加载更多').prop('disabled', false);
                } else {
                    $('.load-more-btn').text('没有更多文章了').prop('disabled', true);
                }
            },
            error: function() {
                $('.load-more-btn').text('加载失败,请重试').prop('disabled', false);
            }
        });
    });
});

3. 分类模板页面调整

在分类模板(如category.php)中,添加容器和加载按钮,并传递当前分类ID:

<div class="articles-container">
    <!-- 初始文章列表 -->
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <div class="article_card">
            <div class="article_card__thumbnail"><?php the_post_thumbnail('medium'); ?></div>
            <div class="article_card__content">
                <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                <p class="body-small"><?php echo wp_trim_words(get_the_excerpt(), 60); ?></p>
                <a href="<?php the_permalink(); ?>"> Learn more →</a>
            </div>
        </div>
    <?php endwhile; endif; ?>
</div>

<div class="load-more-container" data-category-id="<?php echo get_queried_object_id(); ?>">
    <button class="load-more-btn">加载更多</button>
</div>

关键改进点

  • 添加了AJAX请求的nonce验证,提升安全性,防止恶意请求。
  • 通过前端传递分类ID,确保AJAX请求能准确获取当前分类的文章。
  • 使用cat(分类ID)替代category_name作为查询条件,避免分类别名修改导致的查询错误。
  • 对输出的HTML链接和文本进行了转义处理(esc_url、esc_html),防止XSS漏洞。

内容的提问来源于stack exchange,提问作者ImpsImperial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:10:38