Intereting Posts
Изменение фона div в соответствии с выбранной категорией Установить изображение не открывается – застрял при загрузке Любой способ включить пользовательские поля в результаты WP_Query? Отображать количество ожидающих сообщений в обратном / переднем конце Получить пользовательскую панель на странице пользовательского пост-архива Как заказать список таксономий? Сортировать по? не может изменить несколько строк текста на другой язык Добавить категорию в post permink Могу ли я определить несколько папок на одной странице? Добавить тему поддержки пользовательский заголовок не скроет текст? Есть ли способ удалить или скрыть отдельные страницы на экране «Редактировать страницы»? Используйте другой шаблон, чем author.php для get_author_posts_url () Как синхронизировать роли в Multisite? Создание meta_key и значения (ID) путем выбора имени сообщения Пользовательский почтовый мета-ящик в качестве подформы

Как создать виртуальные страницы с информацией из полей мета-профиля пользователя?

Дейв Йеш на своем сайте представляет способ создания виртуальных страниц в WordPress . По его словам, Дэйв создал класс « сделать все тяжелое дело ». Я думаю, для моих целей этот класс не требует изменений, поэтому я не ставил его здесь. Кроме того, Дэйв создал функцию (см. Ниже), которая вызывает вышеупомянутый класс для создания виртуальной страницы, когда это необходимо. Я тестировал этот метод, и он просто работает.

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

Вот как я создаю и сохраняю дополнительные поля профиля пользователя:

/* Add Extra Fields to the User Profile */ add_action( 'show_user_profile', 'extra_user_profile_fields' ); add_action( 'edit_user_profile', 'extra_user_profile_fields' ); function extra_user_profile_fields( $user ) { ?> <h3><?php _e("Academic", "blank"); ?></h3> <table class="form-table"> <!-- Teaching position --> <tr> <th><label for="teaching_position"><?php _e("Teaching position"); ?></label></th> <td> <input type="text" name="teaching_position" id="teaching_position" value="<?php echo esc_attr( get_the_author_meta( 'teaching_position', $user->ID ) ); ?>" class="regular-text" /><br /> <span class="description"><?php _e("Put here your teaching position"); ?></span> </td> </tr> </table> } /* Save Extra User Profile Fields */ add_action( 'personal_options_update', 'save_extra_user_profile_fields' ); add_action( 'edit_user_profile_update', 'save_extra_user_profile_fields' ); function save_extra_user_profile_fields( $user_id ) { if ( !current_user_can( 'edit_user', $user_id ) ) { return false; } update_user_meta( $user_id, 'teaching_position', $_POST['teaching_position'] ); } 

Это функция Daves, которая вызывает свой класс для создания виртуальных страниц:

 function dj_create_virtual() { $url = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); if ($url == 'dave-virtual-page') { $args = array('slug' => 'dave-virtual-page', 'title' => 'Dave\'s Virtual Page', 'content' => "This can be generated content, or static content<br /> Whatever you put here will appear on your virtual page."); $pg = new DJVirtualPage($args); } } add_action('init', 'dj_create_virtual'); 

И вот как я показываю в настоящее время список участников определенного отдела на моем сайте (с коротким кодом):

 add_shortcode( 'list_of_members', 'members_listing' ); /* usage: [list_of_members department = 'psychology'] */ function members_listing( $department ) { $members = get_users( array( 'meta_key' => 'department', 'meta_value' => $department ) ); usort($members, create_function('$a, $b', 'return strnatcasecmp($a->last_name, $b->last_name);')); echo '<div id="memberlist"><ul>'; foreach ( $members as $member ) { echo '<li>'; echo get_avatar($member->ID); /* Bellow I want to put their names in a link to their virtual pages with some information from their profiles */ echo '<div class="authname">' . $member->first_name . ' ' . $member->last_name; echo '</div></li>'; } echo '</ul></div>'; } как add_shortcode( 'list_of_members', 'members_listing' ); /* usage: [list_of_members department = 'psychology'] */ function members_listing( $department ) { $members = get_users( array( 'meta_key' => 'department', 'meta_value' => $department ) ); usort($members, create_function('$a, $b', 'return strnatcasecmp($a->last_name, $b->last_name);')); echo '<div id="memberlist"><ul>'; foreach ( $members as $member ) { echo '<li>'; echo get_avatar($member->ID); /* Bellow I want to put their names in a link to their virtual pages with some information from their profiles */ echo '<div class="authname">' . $member->first_name . ' ' . $member->last_name; echo '</div></li>'; } echo '</ul></div>'; } 

Теперь я хочу, с классом и функцией Dave, поместить в мою (последнюю) функцию members_listing имена членов в ссылках на их виртуальные страницы с некоторой информацией из их профилей. Как это сделать?

РЕДАКТИРОВАТЬ

Вот функции, о которых идет речь, поскольку я использовал их в конце концов (большое спасибо @gm!):

 function dj_create_virtual() { $url = trim( parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), '/'); if ( strpos( $url, 'users/' ) === 0 ) { $user_nicename = str_replace('users/', '', $url ); $user = get_user_by( 'slug', $user_nicename ); $user_info = array_map( function( $a ){ return $a[0]; }, get_user_meta( $user->ID ) ); $args = array( 'slug' => 'users/' . $user_nicename, 'title' => $user_info['first_name'] . ' ' . $user_info['last_name'], 'content' => get_avatar( $user->ID )); if( !empty( $user_info['teaching_position'] ) ) $args['content'] = $args['content'] . '<h5>Teaching position</h5>' . $user_info['teaching_position']; /* heare are some more user meta profile fields */ $pg = new DJVirtualPage($args); } } add_action('init', 'dj_create_virtual'); 

и функция members_listing :

 add_shortcode( 'list_of_members', 'members_listing' ); /* usage: [list_of_members department = 'psychology'] */ function members_listing( $department ) { $members = get_users( array( 'meta_key' => 'department', 'meta_value' => $department ) ); usort( $members, create_function( '$a, $b', 'return strnatcasecmp($a->last_name, $b->last_name);' ) ); echo '<div id="memberlist"><ul>'; foreach ( $members as $member ) { echo '<li>'; printf( '<div class="authname"><a href="%s">%s</a>', home_url( '/users/' . $member->user_nicename ), get_avatar( $member->ID ) ); printf( '<div class="authname"><a href="%s">%s</a>', home_url( '/users/' . $member->user_nicename ), $member->display_name ); if( !empty( $member->teaching_position ) ) { echo '<br />' . mb_convert_case( $member->teaching_position, MB_CASE_LOWER, 'UTF-8' ); }; echo '</div></li>'; } echo '</ul></div>'; } 

Перед ответом обратите внимание: то, что вы хотите, может быть сделано намного проще и эффективнее, просто создавая реальный тип сообщения: зарегистрируйте cpt, возможно, не публичный (так что ui не отображается на панели управления) и в профиле пользователя сохранение / обновление просто создайте / обновите запись cpt.

Для этого вам не нужен внешний класс, и вы можете просто использовать основные функции wp, показать все страницы участников, показать одну страницу участника, связать их и любые другие вещи, в которых вы нуждаетесь.

В качестве бонуса вы также можете использовать иерархию шаблонов и иметь гораздо большую гибкость.

Одно мое личное эмпирическое правило: «никогда не писать код для пользовательских функций, когда ядро ​​может делать то же самое». В вашем случае основные функции не делают то же самое, делайте это лучше и проще.

Однако, это сайт вопросов и ответов, вы задали вопрос, и это ответ:

функция dj_create_virtual должна быть изменена примерно так:

 function dj_create_virtual() { $url = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); if ( strpos($url, 'member-') === 0 ) { $user_nicename = str_replace('member-', '', $url); $user = get_user_by( 'slug', $user_nicename ); $user_info = array_map( function( $a ){ return $a[0]; }, get_user_meta( $user->ID ) ); $args = array( 'slug' => 'member-' . $user_nicename, 'title' => $user_info['first_name'] . ' ' . $user_info['last_name'], // following is just an example 'content' => 'This is the page for:' . $user_info['first_name'] . ' ' . $user_info['last_name'] ); $pg = new DJVirtualPage($args); } } add_action('init', 'dj_create_virtual'); 

и вашей функции members_listing требуется только небольшое редактирование:

 function members_listing( $department ) { $members = get_users( array( 'meta_key' => 'department', 'meta_value' => $department ) ); usort($members, create_function('$a, $b', 'return strnatcasecmp($a->last_name, $b->last_name);')); echo '<div id="memberlist"><ul>'; foreach ( $members as $member ) { echo '<li>'; echo get_avatar($member->ID); $user_info = array_map( function( $a ){ return $a[0]; }, get_user_meta( $member->ID ) ); $fullname = $user_info['first_name'] && $user_info['first_name'] ? $user_info['first_name'] . ' ' . $user_info['last_name'] : $member->display_name; printf( '<div class="authname"><a href="%s">%s</a></div></li>', home_url('/member-' . $member->user_nicename), $fullname); } echo '</ul></div>'; }