我试图显示分类描述,该描述基于页面设置为显示的分类(使用变量设置)
实际上,无论设置了哪个类别变量,我只看到了第一个描述。
我是这样设置的:
我构建了一个名为“product”的自定义帖子类型,并建立了一个名为“product\\u type”的分类法。
//Register product post type
add_action(\'init\', \'product_register\');
function product_register() {
$labels = array(
\'name\' => (\'Products\'),
\'singular_name\' => (\'Product\'),
\'add_new\' => (\'Add New\'),
\'add_new_item\' => (\'Add New Product\'),
\'edit_item\' => (\'Edit Product\'),
\'new_item\' => (\'New Product\'),
\'view_item\' => (\'View Product\'),
\'search_items\' => (\'Search\'),
\'not_found\' => (\'Nothing found\'),
\'not_found_in_trash\' => (\'Nothing found in Trash\'),
\'parent_item_colon\' => \'\'
);
$args = array(
\'labels\' => $labels,
\'menu_icon\' => \'dashicons-tag\',
\'public\' => true,
\'has_archive\' => true,
\'supports\' => array(\'title\', \'revisions\', \'editor\',\'thumbnail\'),
\'capability_type\' => \'post\',
\'rewrite\' => array("slug" => "product"), // Permalinks format
);
register_taxonomy(\'product_type\', array(\'product\'), array(
\'hierarchical\' => true,
\'label\' => \'Product Type\',
\'singular_label\' => \'Type\',
\'show_ui\' => true,
\'show_admin_column\' => true,
\'query_var\' => true,
\'rewrite\' => true)
);
register_post_type( \'product\' , $args );
}
在wordpress后端,我加载了一些术语并添加了描述。
归档产品。php的工作方式类似于登录页,但将接受来自名为$type的变量的信息来过滤内容。
if (isset($_GET[\'type\']) || !empty($_GET[\'type\']) ) {
$filtered = true;
$type = $_GET[\'type\'];
}
有了这些信息,我可以为包含该分类术语的项目设置WP\\u查询。
if ($filtered == true) {
$type = explode(\' \', $_GET[\'type\']);
$taxonomy = array(
array(
\'taxonomy\' => \'product_type\',
\'field\' => \'slug\',
\'terms\' => $type
)
);
$args = array(
\'post_type\' => \'product\',
\'posts_per_page\' => -1,
\'order\' => \'DEC\',
\'orderby\' => \'title\',
\'offset\' => \'0\',
\'tax_query\' => $taxonomy
);
$the_query = new WP_Query($args);
if($the_query->have_posts()):
$terms = get_the_terms( $post->ID, \'product_type\' );
if($terms) {
foreach( $terms as $term ) {
echo $term->description; //always shows first term description, but should display description based on $type
}
}
while($the_query->have_posts()):$the_query->the_post();
the_title();
the_content();
endwhile;
else: //nothing to show here
endif;} else {
// non-filtered page design
}
该查询工作得很好,但正如我前面提到的,它只提取第一个分类描述。
这是要处理的部分:
$terms = get_the_terms( $post->ID, \'product_type\' );
if($terms) {
foreach( $terms as $term ) {
echo $term->description;
}
}
我猜它需要在查询中才能得到正确的描述,但这似乎没有什么区别。
我也尝试过:
$term = get_term_by( $post->ID, $type, \'product_type\' );
echo $term->description;
但这不会返回任何结果。
我没有主意了。我没有通过谷歌或搜索这个网站找到任何东西。
如有任何建议,敬请谅解。
最合适的回答,由SO网友:Pieter Goosen 整理而成
这里有很多问题:
您不应该使用$_GET
未对其进行清理的变量。永远不要信任任何用户输入和URL参数。它们可能包含可能危害您的网站的恶意代码。清理和验证$_GET
变量,使用filter_input
php函数
$filtered = filter_input( INPUT_GET, \'type\', FILTER_SANITIZE_STRING )
使用主查询并使用
pre_get_posts
相应地筛选主查询。无需使用自定义查询,因为这是一个存档页
如果您试图将当前术语描述弄错,您应该使用get_term_by
获取包含所需信息的术语对象
这可能与此无关,但为什么不使用taxonomy.php
页面将按其应该的方式处理上述所有内容。你只需要冲洗你的永久性皮肤,一切都应该正常工作。但这是你需要在自己的时间里调查的事情
让我们首先整理归档页面。为了便于理解,我对代码进行了注释。我不知道您将通过多少个术语,但从您的代码中,我获得了比1更多的术语。如果没有,请查看代码并进行相应调整
$filtered = filter_input( INPUT_GET, \'type\', FILTER_SANITIZE_STRING );
if ( $filtered ) {
/**
* I don\'t know if you will be passing more than one term. From your code it seems so
*/
$types = explode( \' \', $filtered );
foreach ( $types as $type ) {
/**
* Get the term object.
*
* I have used the slug here as it seems that you are passing the slug. Adjust as necessary
*
* @see get_term_by()
*/
$term = get_term_by( \'slug\', $type, \'product_type\' );
// Make sure that $term has a valid value before outputting anything
if ( !empty( $term ) || !is_wp_error( $term ) )
echo $term->description; // Show term description
}
/* Replace code above with the following if you are passing just one term
$term = get_term_by( \'slug\', $filtered, \'product_type\' );
if ( !empty( $term ) || !is_wp_error( $term ) )
echo $term->description; // Show term description
*/
if ( have_posts() ) {
while( have_posts() ) {
the_post();
the_title();
the_content();
}
}
} else {
// non-filtered page design
// I don\'t know what will be displayed here, so I\'m keeping the loop and this separate
}
这将对存档页面进行排序。默认情况下,以下内容默认通过,因此我们不会在操作中通过它们
支柱类型
偏移量。
所以,让我们看看我们的行动。我再次对代码进行了注释,使其易于理解。请注意,由于短数组语法,以下内容至少需要PHP 5.4以上([]
) 正在使用中。对于旧版本,请回滚到旧数组语法(array()
)
add_action( \'pre_get_posts\', function ( $q )
{
$filtered = filter_input( INPUT_GET, \'type\', FILTER_SANITIZE_STRING );
if ( !is_admin() // Only target the front end
&& $q->is_main_query() // Only target the main query
&& $q->is_post_type_archive( \'product\' ) // Only target product archive page
&& $filtered // If we have a $_GET[\'type\'] variable
) {
if ( isset( $q->get( \'tax_query\' ) ) ) //Get current tax query
$tax_query = []; // Set current tax_query to an empty array
// Set our new tax_query
$tax_query = [
[
\'taxonomy\' => \'product_type\',
\'field\' => \'slug\'
\'terms\' => explode( \' \', $filtered ),
\'include_children\' => false
]
];
$q->set( \'tax_query\', $tax_query ); // Set new tax_query
$q->set( \'posts_per_page\', -1 ); // Get all posts
$q->set( \'order\', \'DESC\' ); // Descending sort order
$q->set( \'orderby\', \'title\' ); // Sort by title
}
});
我希望这就是你需要的