分类列表链接到该术语中第一个帖子

时间:2012-11-02 作者:Bostow

我有一个自定义的“artworks”帖子类型和一个自定义的“Artisters”分类法。页面艺术家。php我已经创建了一个所有艺术家的自定义列表,并希望将每个艺术家的名字链接到与该术语相关的第一篇帖子,而不是链接到术语的页面。这是我当前的代码:

<?php while ( have_posts() ) : the_post(); ?>
<?php 

$args = array(
    \'post_type\' => \'artworks\', // change this to the post type you registered
    \'posts_per_page\' => 1,
    \'tax_query\' => array(
      array(
        \'taxonomy\' => \'artists\',
        \'field\' => \'id\'
      )
    )
  );
 $first_cat_post = get_posts($args);

$terms = get_terms(\'artists\', $args);

// list artists alphabetically by last name
$count = count($terms); $i=0;
if ($count > 0) {
    $term_list = \'<ul class="artist-list">\';
    foreach ($terms as $term) {
        $i++;

        // group terms by first letter                      
        $this_char = strtoupper(substr($term->name,0,1));
        if ($this_char != $last_char) {
          $last_char = $this_char;
          $term_list .= \'<li><h2>\'.$last_char.\'</h2></li>\';
        } 

        $termid = \'artists_\' . ($term->term_id);
        $termfirst = get_field(\'first_name\', $termid);

        // link artist name with first work by that artist
        $term_list .= \'<li><a href="\' . get_term_link( $term->slug, $term->taxonomy ) . \'" title="\' . sprintf(__(\'View all post filed under %s\', \'my_localization_domain\'), $term->name) . \'">\' . $termfirst . \' \' . $term->name . \'</a></li>\';     
    }
    $term_list .= \'</ul>\';
    echo $term_list;
}

?><?php endwhile; // end of the loop. ?>
这是dev site. 现在,术语列表项正在链接到该术语页面,但它是404。This Answer looks promising, 但我不知道要将代码放在哪个模板文件中。我尝试输入以下代码:

<?php
/*
Redirect To First Child
*/
if (have_posts()) {
  while (have_posts()) {
    the_post();
    $pagekids = get_pages("child_of=".$post->ID."&sort_column=menu_order");
    $firstchild = $pagekids[0];
    wp_redirect(get_permalink($firstchild->ID));
  }
}
?>

在分类艺术家中。php,但什么都没有发生。

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

// link artist name with first work by that artist
$term_list .= \'<li><a href="\' . get_term_link( $term->slug, $term->taxonomy ) . \'" title="\' . sprintf(__(\'View all post filed under %s\', \'my_localization_domain\'), $term->name) . \'">\' . $termfirst . \' \' . $term->name . \'</a></li><li>\' . the_terms() . \'</li>\';     
将以上行更改为

$posts = get_posts(array(
    \'post_type\' => \'artworks\',
    \'numberposts\' => 1,
    \'post_status\' => \'publish\',
    \'artists\' => $term->slug,
    \'orderby\' => \'date\',
    \'order\' => \'DESC\'
));
// link artist name with first work by that artist
$term_list .= \'<li><a href="\' . get_permalink( $posts[0]->ID ) . \'" title="\' . sprintf(__(\'View all post filed under %s\', \'my_localization_domain\'), $term->name) . \'">\' . $termfirst . \' \' . $term->name . \'</a></li><li>\' . the_terms() . \'</li>\';     
这将更改到最新帖子的链接。您可能需要修改“orderby”&;代码中的“order”参数。此处提供了可能的值http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

在您的代码中,您不需要该行$first_cat_post = get_posts($args);

另外,请更正$args, 参考请参见本页http://codex.wordpress.org/Function_Reference/get_terms

SO网友:Adam

我不认为get_pages 我相信这是一个合适的用途get_posts 是你需要的。而且wp_redirect 如果只是将其放入主题模板文件中,则不会起作用IF 邮件头已发送。最好从您的功能内部执行。php,如下例所示。

我们正在抓住template_重定向在向用户显示演示文稿之前要触发的最后一个操作(然后是get\\u标头等)。

然后检查查询变量是否试图检索属于我们的分类法的术语名称(在您的情况下artists) 如果这种情况再次出现true 我们获取第一篇帖子,它的永久链接,然后将用户重定向到第一篇帖子。

解决方案:(放在functions.php文件中)

add_action(\'template_redirect\', \'first_post\');

function first_post(){
    global $wp_query;
    global $post;

    if ( $wp_query->query_vars[\'artists\'] === get_query_var(\'artists\') ) {

    $args = array(
        \'post_type\' => \'artworks\', // change this to the post type you registered
        \'posts_per_page\' => 1,
        \'tax_query\' => array(
            array(
                \'taxonomy\' => \'artists\',
                \'field\' => \'slug\',
                \'terms\' => get_query_var( \'artists\' )
                )
            )
    );

    $first_post = get_posts($args);
    foreach($first_post as $post) : setup_postdata($post); 
    wp_redirect(get_permalink($post->ID));
    exit;
    endforeach;

    }//end if-block conditional
}
这种方法的优点是可以保持链接结构的外观,例如;

✔;http://www.example.com/artists/michael-aakhus/
✔;http://www.example.com/artists/jane-abrams/
等。。。

而不是您的链接显示为,

⨯;http://www.example.com/artists/michael-aakhus/%postname%
⨯;http://www.example.com/artists/jane-abrams/%postname%
等。。。

当然,在用户被重定向之前,地址栏将显示带有完整帖子名称的相应URL。

结束

相关推荐