将文本区域中的用户元数据显示为格式化文本

时间:2013-01-20 作者:Iurie

通过以下两个功能,我可以将名为“publications”的textarea自定义用户元字段添加到用户配置文件并保存/更新它:

add_action( \'show_user_profile\', \'extra_user_profile_fields\' );
add_action( \'edit_user_profile\', \'extra_user_profile_fields\' );

function extra_user_profile_fields( $user ) { ?>
  <textarea rows="10" cols="450" name="publications" id="publications"  class="regular-text" />
  <?php echo esc_attr( get_the_author_meta( \'publications\', $user->ID ) ); ?></textarea>
<?php }


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, \'publications\', $_POST[\'publications\'] );
}
使用下一个函数,我可以在用户页面上显示上面创建的字段中的元数据,并带有一个短代码[USER_META user_id=2 meta="publications"]:

add_shortcode(\'USER_META\', \'user_meta_shortcode_handler\');

function user_meta_shortcode_handler($atts,$content=null){
    return esc_html(get_user_meta($atts[\'user_id\'], $atts[\'meta\'], true));
}
问题是,在文本区域中,我可以用简单的段落格式化文本,但当它显示在前端时,段落就会消失,我只看到简单的文本流。如何解决这个问题?

我有Wordpress 3.5,2012主题。

3 个回复
最合适的回答,由SO网友:Iurie 整理而成

最后,我采用了第二种解决方案:

/* Display the selected user meta data with a shortcode */
add_shortcode(\'user_meta\', \'user_meta_shortcode_handler\');
/* usage: [user_meta user_id=1] */
function user_meta_shortcode_handler($atts,$content=null){ ?>
  <?php
    echo \'<h3>Publications</h3>\';
    echo wpautop(get_user_meta($atts[\'user_id\'], \'publications\', true));
  ?>
  <?php
}
为了取得好的效果,段落之间应该用空行隔开。

EDIT: 我将代码更新为以下内容(第二种解决方案):

add_shortcode(\'user_meta\', \'user_meta_shortcode_handler\');
/* usage: [user_meta user_id=1] */
function user_meta_shortcode_handler($atts,$content=null){ ?>
  <?php

    $text = "";

    //Explode the textareas rows to paragraphs
    function explode_paragraphs($text) {
      $text = explode("\\n", $text); 
      foreach($text as $str) { echo \'<p>\'.$str.\'</p>\'; }
    }

    $text = esc_html(get_user_meta($atts[\'user_id\'], \'publications\', true));
    if(!empty($text)) { echo \'<h3>Publications</h3>\'; explode_paragraphs($text); }

  ?>
  <?php
}
现在,为了获得好的结果,段落之间不应该用空行分隔。

SO网友:Muhammad Furqan

看看这两个函数esc_attr()esc_html()

替换此项:

add_shortcode(\'USER_META\', \'user_meta_shortcode_handler\');

function user_meta_shortcode_handler($atts,$content=null){
    return esc_html(get_user_meta($atts[\'user_id\'], $atts[\'meta\'], true));
}
使用此选项:

add_shortcode(\'USER_META\', \'user_meta_shortcode_handler\');

function user_meta_shortcode_handler($atts,$content=null){
    return esc_attr(get_user_meta($atts[\'user_id\'], $atts[\'meta\'], true));
}

SO网友:Simon Blackbourn

您可以使用PHP的nl2br 将换行符转换为的函数<br> 标签,或者你可以试试this Stack Overflow answer.

结束

相关推荐