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
相关产品推荐
相关产品推荐

