如果类别中只有一个帖子,请更改Get_Terms中的链接

时间:2016-01-23 作者:rudtek

我创建了一个快捷代码,它将列出自定义分类法中的类别,并将返回至少有一篇文章(不是空的)的所有类别的列表。

结果是,当有人单击我的链接时,会将他们带到该类别的存档页面。

我的问题是,当该类别中只有一篇帖子时,我是否可以将用户直接发送到该帖子,而不是发送到只有一篇帖子的存档?

这是我的代码:

// Creates a list of eval specialties
function doc_categories() {
$tax = \'team_group\';  // slug of taxonomy to list

$terms = get_terms($tax, array(\'hide_empty\' => 1 ));
$specials = \'<div>\';
foreach ($terms as $term) {
        $slug = $term->slug;
        $description = $term->description;
        $link = "<a href=\'/?$tax=$slug\' ><h5> $term->name </h5></a>";
        $imglink ="<a href=\'/?$tax=$slug\' ><img src=\'".z_taxonomy_image_url($term->term_id)."\'></a>";

$specials .=\'<div class="flex_column av_one_third specialty flex_column_div">\';
$specials .=\'<div class="specialty-name"\'.$link.\'</div>\';
$specials .= $imglink;
$specials .= \'</div>\';
        }
$specials .= \'</div>\';
return $specials;
}
add_shortcode( \'evalspecialties\', \'doc_categories\' );

2 个回复
最合适的回答,由SO网友:BillK 整理而成

当wp\\U查询仅返回给定类别的一篇文章时,可以在显示存档页面的模板中执行此操作。类似这样:

if ( $wp_query->post_count == 1 && $wp_query->max_num_pages == 1 ) {
    wp_redirect( get_permalink( $wp_query->posts[\'0\']->ID ) );
    exit;
}

SO网友:Pieter Goosen

来自评论的最终编辑

不幸的是,当我尝试方法一时,所有链接都返回到主页

正如我所说的,在我的测试安装中一切都正常。我实际上忘记了你的代码对你有用,因为你已经硬编码了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;
});
编辑上面的代码现在已经测试并运行

相关推荐

我在相关产品“TAX_QUERY”‘TERMS’值方面遇到问题

我有两种自定义页面类型。第一个是;“产品”;第二个是;附件;。在产品页面上,有“附件”类别;“输入”;罗列立柱。输入对值进行编码,如;06010603等;。这些代码也是产品代码。当我用metabox输入产品代码时,功能会在某些区域启动。如产品表、产品图片等。如何在术语部分打印此代码。提前感谢你们的帮助。工作代码;<?php $article_list = get_post_meta ( get_the_ID(), \'products_article_list\', t