【发布时间】:2026-02-22 20:05:01
【问题描述】:
首先感谢您查看/您可能提供的任何帮助。
我正在尝试创建一个自定义页面模板,该模板按字母顺序创建一个列表,显示我网站上特定 (Woocommerce) 产品属性的所有结果。
所以在我的例子中,产品属性是“艺术家”
我发现了一些对帖子执行类似操作的代码,修改后的代码如下:
<?php
/*
Template Name: Artists
*/
$posts_per_row = 4;
$posts_per_page = 400;
?>
<?php get_header(); ?>
<?php get_template_part( 'headers/page', 'header' ); ?>
<style type="text/css">
.letter-group { width: 100%; }
.letter-cell { width: 5%; height: 2em; text-align: center; padding-top: 8px; margin-bottom: 8px; float: left; }
.row-cells { width: 75%; float: right; margin-right: 180px; }
.title-cell { width: 25%; float: left; overflow: hidden; margin-bottom: 8px; }
.clear { clear: both; }
</style>
<div class="ps-container">
<div class="container clearfix">
<div id="main-background">
<div id="main-column">
<h1><?php the_title(); ?></h1>
<div class="margin-top"></div>
<div id="a-z">
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array (
'posts_per_page' => $posts_per_page,
'post_type' => 'product',
'orderby' => 'title',
'order' => 'ASC',
'paged' => $paged
);
query_posts($args);
if ( have_posts() ) {
$in_this_row = 0;
while ( have_posts() ) {
the_post();
$first_letter = strtoupper(substr(apply_filters('the_title',$post->post_title),0,1));
if ($first_letter != $curr_letter) {
if (++$post_count > 1) {
end_prev_letter();
}
start_new_letter($first_letter);
$curr_letter = $first_letter;
}
if (++$in_this_row > $posts_per_row) {
end_prev_row();
start_new_row();
++$in_this_row; // Account for this first post
} ?>
<div class="title-cell"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></div>
<?php }
end_prev_letter();
?>
<div class="navigation">
<div class="alignright"><?php next_posts_link('Next Page »') ?></div>
<div class="alignleft"><?php previous_posts_link('« Previous Page') ?></div>
</div>
<?php } else {
echo "<h2>Sorry, no artists were found!</h2>";
}
?>
</div><!-- End id='a-z' -->
</div><!-- End class='margin-top -->
</div><!-- End id='rightcolumn' -->
</div>
</div>
<?php get_footer(); ?>
<?php
function end_prev_letter() {
end_prev_row();
echo "</div><!-- End of letter-group -->\n";
echo "<div class='clear'></div>\n";
}
function start_new_letter($letter) {
echo "<div class='letter-group'>\n";
echo "\t<div class='letter-cell'>$letter</div>\n";
start_new_row($letter);
}
function end_prev_row() {
echo "\t</div><!-- End row-cells -->\n";
}
function start_new_row() {
global $in_this_row;
$in_this_row = 0;
echo "\t<div class='row-cells'>\n";
}
?>
现在要改变这一点,我尝试使用 get 属性代替数组来检索我的帖子,就像我通常在我网站的其他位置使用的那样:
global $product;
$product->get_attribute( ‘pa_attribute’ )
但没有任何效果。
谁能解释我的问题?我可以正常显示帖子,但我无法将其转换为正确列出艺术家姓名而不是产品(帖子)名称。
谢谢。
【问题讨论】:
-
如果您想获取术语列表,则需要使用
get_terms()查询术语,而不是查询帖子。顺便说一句,无论如何都要使用WP_Query而不是query_posts()。 -
感谢您的提示。请原谅我在这里缺乏知识,但在这种情况下我将如何使用 get_terms() 作为属性?
-
查看我链接到的 Codex 文章。甚至还有一个很好的例子来说明如何查询术语然后循环它们。
-
我会这样做,谢谢。我想没有人会回答,所以如果你想把你的评论变成一个答案,我会接受它。感谢您的帮助。
标签: php wordpress attributes woocommerce product