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


Дейв Джеш на своем сайте представляет способ создания виртуальных страниц в 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>';
}
Author: Iurie Malai, 2013-09-05

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>';
}
 2
Author: gmazzap, 2013-09-07 05:38:10