Я пытаюсь создать раскрывающийся список авторов WordPress, со ссылками на их страницу автора.
Вот мой текущий код:
<?php wp_dropdown_users(array('who'=>'authors')); ?>
У меня есть аналогичный раскрывающийся список для моих архивов, который ниже (и работает).
<select name="archive-dropdown" id="archives-dropdown--1" onchange="document.location.href=this.options[this.selectedIndex].value;"> <option value=""><?php echo esc_attr( __( 'Select Month' ) ); ?></option> <?php wp_get_archives( array( 'type' => 'monthly', 'format' => 'option','show_post_count' => 1 ) ); ?> </select>
Прямо сейчас, авторы просто показывают в раскрывающемся списке, но они не ссылаются на их страницы. Я пробовал адаптировать код архива к моему авторскому коду, но я ничего не получаю. Вот что я пытался, но это не работает:
<select name="author-dropdown" id="author-dropdown--1" onchange="document.location.href=this.options[this.selectedIndex].value;"> <option value=""><?php echo esc_attr( __( 'Select Author' ) ); ?></option> <?php wp_dropdown_users(array('who'=>'authors')); ?> </select>
Я все еще довольно молод с моей кодировкой WordPress. Любое понимание было бы здорово! Я надеюсь, что смогу помочь другим, если это будет решено для моей ситуации.
Благодаря!
Я могу ошибаться, так как не знаю, как WordPress контролирует выпадающее меню, но похоже, что он может только возвращать имя автора, а не ссылку на их страницу.
Я проверил приведенный ниже код в среде сайта WordPress и работал, включая ссылку на страницу авторов.
<select name="author-dropdown" id="author-dropdown--1" onchange="document.location.href=this.options[this.selectedIndex].value;"> <option value=""><?php echo esc_attr( __( 'Select Author' ) ); ?></option> <?php // loop through the users $users = get_users('role=author'); foreach ($users as $user) { if(count_user_posts( $user->id ) >0) { // We need to add our url to the authors page echo '<option value="'.get_author_posts_url( $user->id ).'">'; // Display name of the auther you could use another like nice_name echo $user->display_name; echo '</option>'; } } ?> </select>
Добавлено обновление для того, чтобы убедиться, что у авторов есть сообщение, а затем добавлено администратору, не уверен, как объединить две роли, не выполняя дуэль foreach
<select name="author-dropdown" id="author-dropdown--1" onchange="document.location.href=this.options[this.selectedIndex].value;"> <option value=""><?php echo esc_attr( __( 'Select Author' ) ); ?></option> <?php // loop through the users $users = get_users('role=author'); foreach ($users as $user) { // get user who have posts only if(count_user_posts( $user->id ) >0) { // We need to add our url to the authors page echo '<option value="'.get_author_posts_url( $user->id ).'">'; // Display name of the auther you could use another like nice_name echo $user->display_name; echo '</option>'; } } $users = get_users('role=administrator'); foreach ($users as $user) { // get user who have posts only if(count_user_posts( $user->id ) >0) { // We need to add our url to the authors page echo '<option value="'.get_author_posts_url( $user->id ).'">'; // Display name of the auther you could use another like nice_name echo $user->display_name; echo '</option>'; } } ?> </select>
Более «способ WordPress» заключается в том, чтобы отфильтровать вывод функции wp_dropdown_users()
вместо того, чтобы в основном воссоздать функцию.
В своей теме или плагине вы хотите добавить фильтр непосредственно перед вызовом wp_dropdown_users()
и сразу же удалить его, чтобы предотвратить нежелательные побочные эффекты.
add_filter( 'wp_dropdown_users', 'wpse_260893_dropdown_users' ); wp_dropdown_users( [ 'who' => 'authors' ] ); remove_filter( 'wp_dropdown_users', 'wpse_260893_dropdown_users' );
Затем вы можете разместить это в своем плагине или в функции functions.php.
//* Filter the output of wp_dropdown_users() function to replace user id with posts url function wpse_260893_dropdown_users( $content ) { //* Find all cases where the option value is anything - (.*) $number_of_matches = preg_match_all( '/<option value=\'(.*)\'/', $content, $matches ); //* If there's no matches, return early if( false === $number_of_matches || 0 === $number_of_matches ){ return $content; } //* Get the author posts url for each of the matches found with preg_match_all() $posts_urls = array_map( function( $user_id ){ return get_author_posts_url( $user_id ); }, $matches[1] ); //* Replace the author ids with their corresponding author posts url return str_replace( $matches[1], $posts_urls, $content ); }
Не забудьте добавить фильтр, в который вы хотите изменить вывод функции wp_dropdown_users()
и сразу же удалить его после того, как он вам больше не понадобится, чтобы он ничего не влиял.