Как отобразить архив с несколькими авторами

У меня есть эта проблема с кодированием, которая избивает мою голову

Я создал сайт для академического журнала, где некоторые статьи написаны двумя или более авторами. Это было легко достигнуто с использованием плагина Co-Author или Co-Author Plus, как показано на следующем рисунке. Несколько авторов в одном сообщении

Затем, используя этот код, я создал архив авторов, где я показываю все авторы 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; ?> 

Но в коде отображаются только «первые» авторы. т.е. первый автор, назначенный на должность, а не второй и третий. Итак, если второй или третий автор не опубликовал другого отдельного поста, он не появится в списке авторов.

Итак, вопрос в том, как я могу изменить этот код, чтобы показать всех авторов, связанных с сообщением? Может быть, строка, где author_has_post> = 0, а затем, как предотвратить появление автора admin в списке

Solutions Collecting From Web of "Как отобразить архив с несколькими авторами"

Это будет иметь смысл в качестве дополнения для плагина Co-Authors Plus, но вы не всегда можете зависеть от разработчиков плагинов, чтобы предвидеть все наши потребности. Иногда нам просто нужно строить для себя! 🙂

Скриншот, показывающий плагин Co-Authors Plus для WordPress

Соавторы, хранящиеся как термины таксономии 'author'

Оказывается, что вы хотите сделать, не слишком сложно. Я буду похвалить разработчиков плагинов за то, что я считаю лучшими практиками; они создали таксономию под названием 'author' и для имен терминов, которые они использовали в поле user_login автора.

Используйте get_terms() чтобы получить список соавторов

Таким образом, легко получить список авторов, просто вызвав основную функцию WordPress get_terms() передав ее 'author' таксономии и указав, что вам нужен только термин 'name' .

Прямой SQL необходим для списка идентификаторов авторов

К сожалению, большие пальцы вниз к ядру WordPress не предоставляют никакого способа получить список идентификаторов автора, основанный на списке значений user_login отличных от прямого SQL.

Наша get_coauthor_list()

Взятые вместе мы можем создать нашу простую get_coauthor_list() чтобы вернуть список идентификаторов авторов для всех доступных соавторов. Вот код (вы можете добавить это в нижнюю часть файла шаблона темы или лучше добавить в файл functions.php вашей темы или даже еще лучше добавить, чтобы люди Co-Authors Plus добавили в свой плагин):

 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:

 <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; ?> 

И когда все сказано и сделано, это выглядит так:

Скриншот, показывающий авторский архив для Co-Authors Plus Plugin для WordPress

PS По иронии судьбы, чтобы понять это для вас, мне пришлось установить плагин, который затем потребовал от меня отладки (что оказалось незначительным) сообщение об ошибке при активации плагина, в результате чего я отправил этот отчет об ошибке ; надеюсь, они исправят ошибку в будущих выпусках.

WordPress по дизайну знает только одного автора за сообщение и отображает его так в списках, таких как архивы.

Поэтому вам нужно добавить дополнительный индивидуальный код в зависимости от данных плагинов. В приведенном выше примере кода вам нужно позаботиться о том, чтобы сформулированный SQL-запрос возвращал больше, чем только одну строку. Очевидно, тот, который вы сейчас используете, возвращает только автора, сохраненного wordpress. Как я уже писал, один по дизайну .

Вы должны обсудить эту проблему с автором (-ами) плагина, поскольку он специфичен для плагина. Поэтому они знают, в какие проблемы вы столкнулись при использовании плагинов (ов). Возможно, у них есть форум, где вы можете получить код, который уже готов к использованию.