如何显示多个作者的档案

时间:2010-12-24 作者:Sergio Majluf

我遇到了一个让我头疼的编码挑战

我为一家学术杂志建立了一个网站,其中一些文章由两位或两位以上的作者撰写。如下图所示,这可以通过使用联合作者或联合作者插件轻松实现。Multiple authors in a single post

然后,使用这段代码,我构建了一个作者档案,在那里我显示所有wordpress作者发布的文章。

<?php
$authors = $wpdb->get_results(\'SELECT DISTINCT post_author FROM \'.$wpdb->posts.\' JOIN wp_usermeta ON user_id = post_author WHERE meta_key=\\\'last_name\\\' ORDER BY meta_value\');

if($authors):
foreach($authors as $author):
?>
<div class="author" id="author-<?php the_author_meta(\'user_login\', $author->post_author); ?>">

<?php if(get_the_author_meta(\'description\', $author->post_author)): ?>
<div class="description">
<h3><a href="<?php bloginfo(\'url\'); ?>/author/<?php the_author_meta(\'user_nicename\', $author->post_author); ?>"><?php the_author_meta(\'last_name\', $author->post_author); ?>, <?php the_author_meta(\'first_name\', $author->post_author); ?></a></h3>
<p><?php the_author_meta(\'description\', $author->post_author); ?></p>
</div>
<?php else : ?>
<!-- <div class="description">
<p>No description in the author\'s profile.</p>
</div> -->
<?php endif; ?>

</div>
<?php endforeach; endif; ?>
但代码只显示“第一”作者。i、 e分配给某一职位的第一作者,而不是第二作者或第三作者。因此,如果第二个或第三个作者没有自己发表另一篇不同的文章,他将不会出现在作者列表中。

所以,问题是,我如何修改此代码以显示与帖子关联的所有作者?可能是author\\u has\\u post>=0的字符串,然后是如何防止管理员作者出现在列表上

2 个回复
SO网友:MikeSchinkel

这对于包含Co-Authors Plus 但是你不能总是依赖插件开发者来预测我们的所有需求。有时我们只需要为自己建造!:-)

Screenshot showing Co-Authors Plus Plugin for WordPress
(来源:mikeschinkel.com)

共同作者存储为分类术语\'author\'

事实证明,你想做的并不难。我要赞扬插件开发人员使用了我认为最好的实践;他们创建了一个名为\'author\' 对于他们使用的术语名称,作者user_login 领域

使用get_terms() 要获取共同作者列表,只需调用WordPress核心函数即可轻松获取作者列表get_terms() 通过分类法\'author\' 并指定您只需要术语\'name\' 领域

作者ID列表需要直接SQL,不幸的是,WordPress core没有提供基于user_login 直接SQL以外的值。

我们的get_coauthor_list() 函数一起,我们可以创建get_coauthor_list() 函数返回所有可用共同作者的作者ID列表。下面是代码(您可以将其添加到主题模板文件的底部,或者更好地将其放入主题的functions.php 文件,或者更好的方法是让合著者和其他人添加到他们的插件中):

function get_coauthor_list() {
  global $wpdb;
  $authors = implode("\',\'",get_terms(\'author\',array(\'fields\'=>\'names\')));
  $sql = "SELECT ID " .
         "FROM {$wpdb->users} " . 
         "WHERE user_login IN (\'{$authors}\') " .  
         "ORDER BY display_name";
  return $wpdb->get_col($sql);
}
使用get_coauthor_list() 在您的主题中,只需将其添加到主题模板文件中即可。我稍微修改了您的代码以使用get_coauthor_list() 并遵循一些最佳做法,例如使用get_author_posts_url() WordPress core中的函数:

<h2>Archives by Author:</h2>
<?php
  $authors = get_coauthor_list();
  if($authors)
    foreach($authors as $author_id):
    ?>
    <div class="author" id="author-<?php the_author_meta(\'user_login\', $author_id); ?>">
      <h3>
        <a href="<?php echo get_author_posts_url($author_id); ?>">
          <?php the_author_meta(\'display_name\', $author_id); ?>
        </a>
      </h3>
      <div class="description">
        <p>
          <?php if($author_description = get_the_author_meta(\'description\',$author_id)): ?>
            <?php echo $author_description; ?>
          <?php else : ?>
            No description in the author\'s profile.
          <?php endif; ?>
        </p>
      </div>
    </div>
    <?php
    endforeach;
?>
当一切都说了又做了的时候,看起来是这样的:

Screenshot showing Author Archive for Co-Authors Plus Plugin for WordPress
(来源:mikeschinkel.com)

P.S. 具有讽刺意味的是,为了让你明白这一点,我不得不安装插件,然后需要我调试插件(结果是无关紧要的)插件激活错误消息,导致我提交this bug report; 希望他们能在将来的版本中纠正这个错误。

SO网友:hakre

Wordpress按设计只知道每篇文章的一位作者,并将其显示在存档等列表中。

因此,您需要根据插件数据添加额外的单独代码。在您发布的代码示例中,您应该注意您制定的SQL查询返回的不仅仅是一行。很明显,您当前使用的是只返回wordpress保存的作者。正如我已经写过的,这是一个单一的设计。

您应该与插件作者讨论这个问题,因为它是特定于插件的。因此,他们知道您在使用插件时遇到了哪些问题。可能他们也有一个论坛,您可以在那里获得已经可以使用的代码。

结束

相关推荐

如何从wp_list_Authors中排除特定作者

我想让作者像往常一样从wp_list_authors() 但我知道有几个我也想从名单中排除。有办法吗?谢谢