来自评论的最终编辑
不幸的是,当我尝试方法一时,所有链接都返回到主页
正如我所说的,在我的测试安装中一切都正常。我实际上忘记了你的代码对你有用,因为你已经硬编码了URL
<a href=\'/?$tax=$slug\' ><h5> $term->name </h5></a>
这告诉我的是
get_term_link()
未返回预期的URL,404的URL被重定向到主页。这很可能是因为您在创建分类后没有刷新永久链接,或者您有永久链接问题。您应该首先对其进行分类,并使用选项1中的代码作为基准。正如我所说的,我的代码现在已经过测试,一切都按照预期工作,所以它也应该适合您
只是一个提示,如果有些东西不起作用,不要像你那样隐藏问题,要解决它。简单地隐藏一个问题可能会导致以后出现其他意外情况;-)
原始答案基本上有两种方法
在您的快捷代码中,您可以检查术语的帖子数量,然后查询单个帖子,然后显示该链接而不是类别链接
使用template_redirect
钩子将术语页重定向到单个帖子$wp_query->found_posts
返回1
在我开始之前,请注意一下。您不应该创建自己的静态链接,当永久链接结构更改时,它们可能会导致问题。允许get_term_link()
处理链接建筑。在您的上下文中,只需将完整的术语对象传递给get_term_link()
. 这不会导致额外的db调用,并且您有一个到术语页的可靠链接
NOTE: 所有代码都未测试
选项1可以在短代码中尝试以下操作
add_shortcode( \'evalspecialties\', \'doc_categories\' );
function doc_categories()
{
$tax = \'team_group\'; // slug of taxonomy to list
$specials = \'\'; //Define $specials as a empy string
// Get all the terms belonging to the team_group taxonomy
$terms = get_terms( $tax );
// IMPORTANT, make sure we have terms and also if we do not have a WP_Error
if ( !$terms
|| is_wp_error( $terms )
)
return $specials;
// Ok, everything checks out, lets continue
$specials .= \'<div>\';
foreach ( $terms as $term ) {
// Just in case we somehow set hide_empty to false through a filter
if ( 0 == $term->count )
continue;
$description = $term->description;
$term_link = get_term_link( $term );
// If we have more than one post, show term link, otherwise show post permalink
if ( 1 == $term->count ) {
$args = [
\'posts_per_page\' => 1,
\'fields\' => \'ids\', //Just get postID
\'tax_query\' => [
[
\'taxonomy\' => $term->taxonomy,
\'terms\' => $term->term_id,
]
],
// Add any extra parameter
];
$q = get_posts( $args );
$term_link = get_permalink( $q[0] );
}
$link = \'<a href="\' . esc_url( $term_link ) . \'"><h5>\' . $term->name . \'</h5></a>\';
$imglink = \'<a href="\' . esc_url( $term_link ) . \'"><img src="\' . z_taxonomy_image_url($term->term_id) . \'"></a>\';
$specials .= \'<div class="flex_column av_one_third specialty flex_column_div">\';
$specials .= $link;
$specials .= $imglink;
$specials .= \'</div>\';
} //endforeach
$specials .= \'</div>\';
return $specials;
}
选项2这是一种更干净的方法。这里您基本上只需检查
$found_posts
, 然后,如果值为1,则重定向到单篇文章页面。我们将使用
template_redirect
在这里
首先快速修改您的短代码
add_shortcode( \'evalspecialties\', \'doc_categories\' );
function doc_categories()
{
$tax = \'team_group\'; // slug of taxonomy to list
$specials = \'\'; // Define $specials as a empy string
// Get all the terms belonging to the team_group taxonomy
$terms = get_terms( $tax );
// IMPORTANT, make sure we have terms and also if we do not have a WP_Error
if ( !$terms
|| is_wp_error( $terms )
)
return $specials;
// Ok, everything checks out, lets continue
$specials .= \'<div>\';
foreach ( $terms as $term ) {
// Just in case we somehow set hide_empty to false through a filter
if ( 0 == $term->count )
continue;
$description = $term->description;
$term_link = get_term_link( $term );
$link = \'<a href="\' . esc_url( $term_link ) . \'"><h5>\' . $term->name . \'</h5></a>\';
$imglink = \'<a href="\' . esc_url( $term_link ) . \'"><img src="\' . z_taxonomy_image_url($term->term_id) . \'"></a>\';
$specials .= \'<div class="flex_column av_one_third specialty flex_column_div">\';
$specials .= $link;
$specials .= $imglink;
$specials .= \'</div>\';
} //endforeach
$specials .= \'</div>\';
return $specials;
}
这将是重定向操作
add_action( \'template_redirect\', function ()
{
global $wp_query;
// Check if found_posts is 1, if not, bail
if ( 1 != $wp_query->found_posts )
return;
// Only target or taxonomy page
if ( !is_tax( \'team_group\' ) )
return;
// We only have one post, redirect to the single post page
$single_post = $wp_query->post;
$permalink = get_permalink( $single_post );
wp_redirect( esc_url( $permalink ) );
exit;
});
编辑上面的代码现在已经测试并运行