如何使用用户元配置文件字段中的信息创建虚拟页面?

时间:2013-09-05 作者:Iurie

Dave Jesch在他的网站上介绍了一种create virtual pages in WordPress. 正如Dave所说,他创建了一个班级“来完成所有的繁重工作”。我想,出于我的目的,这个类不需要更改,所以我不把它放在这里。此外,Dave创建了一个函数(请参见下文),该函数在需要时调用上述类来创建虚拟页面。我测试了这个方法,它很有效。

我想要的是,使用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\');
这就是我当前显示members list of specific department 在我的网站上(使用短代码):

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 在虚拟页面的链接中使用成员名称,并从其配置文件中获取一些信息。如何做到这一点?

EDIT

以下是我最后使用的函数(非常感谢@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 个回复
最合适的回答,由SO网友:gmazzap 整理而成

在回答之前,请注意一点:只需创建一个真正的帖子类型,就可以以更简单、更高效的方式完成您想要的事情:注册一个cpt,可能不是公共的(所以仪表板上没有显示ui),在保存/更新用户配置文件时,只需创建/更新一个cpt条目。

这样做,您不需要任何外部类,只需使用核心wp函数即可显示所有成员页面、显示单个成员页面、链接它们以及您需要的任何其他内容。

作为奖励,您还可以使用template hierarchy 并且有更多的灵活性。

我个人的一条经验法则是:“当core可以做同样的事情时,永远不要为自定义功能编写代码”。在您的情况下,核心功能做得不一样,请做得更好、更简单。

然而,这是一个问题;一个网站,你问了一个问题,答案如下:

这个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>\';
}

结束

相关推荐

Theme Custom Pages

我在做一个函数。新主题系统的php文件。我需要知道如何通过URL使自定义模板可执行。所以如果有人去http://website.com/my-custom-template/ 如何使加载的页面从模板中读取my-custom-template.php 在主题文件夹中?