Как создавать виртуальные страницы с информацией из полей мета-профиля пользователя?
Дейв Джеш на своем сайте представляет способ создания виртуальных страниц в WordPress. Дейв создал класс ", чтобы выполнять всю тяжелую работу", как он говорит. Я думаю, для моих целей этот класс не требует изменений, поэтому я не помещаю его здесь. Кроме того, Дейв создал функцию (см. Ниже), которая вызывает вышеупомянутый класс для создания виртуальной страницы, когда это необходимо. Я протестировал этот метод, и он просто работает.
Чего я хочу, так это использовать класс Дейва и функция для размещения на моем сайте списка сотрудников отдела со ссылками на их виртуальные страницы с некоторым контентом из их профилей. Страницы должны быть виртуальными, поэтому мне не нужно создавать для каждого нового участника реальную страницу, она должна создаваться автоматически (виртуально) из его профиля.
Вот как я создаю и сохраняю некоторые дополнительные поля профиля пользователя:
/* 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'] );
}
Это функция Дейвса, которая вызывает его класс для создания виртуальных страниц:
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>';
}
Теперь я хочу с помощью класса и функции Дейва ввести в мою (последнюю) функцию members_listing
имена участников в ссылках на их виртуальные страницы с некоторой информацией из их профилей. Как это сделать?
РЕДАКТИРОВАТЬ
Вот функции, о которых идет речь, как я их наконец использовал (большое спасибо @g-m!):
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>';
}
1 answers
Перед ответом примечание: то, что вы хотите, можно сделать намного проще и эффективнее, просто создав реальный тип записи: зарегистрируйте cpt, возможно, не общедоступный (поэтому пользовательский интерфейс не отображается на панели мониторинга), а при сохранении/обновлении профиля пользователя просто создайте/обновите запись 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>';
}