Wordpress中的“作者”是什么?有没有可用的作者“metabox类”?

时间:2011-06-30 作者:shawn

我正在尝试概述一个新项目,我想让我的用户能够在我的网站主题中自定义他们的“个人资料”页面。添加自己的背景图像、选择模板等概念。

在我看来,将这些信息存储在author meta中似乎是合乎逻辑的,因为这似乎是唯一一个为每个用户存储唯一信息的表。一旦设置了输入框,我就可以轻松地在主题中进行调用。

用户看起来不像是帖子类型或分类法,但我不知道他们“真正”是什么。有人能花点时间描述一下WordPress眼中的“用户”到底是什么吗?

我最终希望的是找到一个类,在这个类中,我可以轻松地将元盒添加到编辑作者配置文件页面。

我确实知道如何通过表单扩展配置文件字段,但我正在寻找更灵活的方法。

*我将farinspace metabox类用于我的帖子类型,我非常喜欢它的工作方式,真的希望我可以在作者页面上使用类似的东西。。

这有可能吗,或者我应该走一条更好的路吗?

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

作者是WordPress中非常简单的内容对象。他们有roles and capabilities, 一些基本元数据和它们自己的编辑屏幕。差不多就是这样。如果要向作者添加自定义分类法,则必须使用(隐藏的)自定义帖子类型镜像每个用户,因为作者对象不支持分类法…

无论如何……对于元框,我编写了一个简单的类。我希望这有助于理解事情是如何运作的,以及在何处挂钩。

T5\\u类用户\\u配置文件\\u加载项

<?php
/**
 * Adds a form field to the edit profile page.
 *
 * @author Thomas Scholz http://toscho.de
 * @version 1.2
 * @license GPL
 *
 */
class T5_User_Profile_Addon
{

    public $settings = array (
    /* The name attribute. */
        \'name\'        => \'\'
    ,   \'label\'       => \'\'
    ,   \'description\' => \'\'

    /* You may use the following placeholder:
     * %name%        - name attribute
     * %label%       - label text
     * %description% - additional text
     * To use more placeholders, extend markup_filter().
     */
    ,   \'markup\'      => \'\'
    /* If both are not FALSE, they will replace the \'markup\', and a
     * table will be created. Uses the same placeholders as \'markup\'.
     */
    ,   \'th\'          => FALSE
    ,   \'td\'          => FALSE
    /* Capabilities to show and edit the field.
     * Useful, if want to add a field that only administrators or editors
     * may edit or view.
     */
    ,   \'cap_show\'    => \'read\'
    ,   \'cap_save\'    => \'edit_user\'
    );

    /**
     * Constructor
     *
     * @param array $args See settings. \'name\' and \'markup\' required.
     */
    public function __construct( $args )
    {
        $this->settings = array_merge( $this->settings, $args );

        // The id attribute should be different to name, otherwise it doesn’t
        // work in Opera.
        empty ( $this->settings[\'id\'] )
            and $this->settings[\'id\'] = $this->settings[\'name\'] . \'_id\';

        FALSE !== $this->settings[\'th\'] and FALSE !== $this->settings[\'td\']
            and $this->settings[\'markup\'] = \'<table class="form-table"><tr><th>\'
                . $this->settings[\'th\'] . \'</th><td>\' . $this->settings[\'td\']
                . \'</td></tr></table>\';

        add_action( \'show_user_profile\',        array ( $this, \'show\' ) );
        add_action( \'edit_user_profile\',        array ( $this, \'show\' ) );
        add_action( \'personal_options_update\',  array ( $this, \'save\' ) );
        add_action( \'edit_user_profile_update\', array ( $this, \'save\' ) );
    }

    /**
     * Prints the form.
     *
     * @param  object $user
     * @return void
     */
    public function show( $user )
    {
        if ( ! current_user_can( $this->settings[\'cap_show\'], $user->ID ) )
        {
            return;
        }

        $label   = "<label for=\'{$this->settings[\'id\']}\'>{$this->settings[\'label\']}</label>";
        $markup  = strtr( $this->settings[\'markup\'],
            array (
                \'%name%\'        => $this->settings[\'name\']
            ,   \'%id%\'          => $this->settings[\'id\']
            ,   \'%label%\'       => $label
            ,   \'%description%\' => $this->settings[\'description\']
            )
        );
        $old_val = trim( get_the_author_meta( $this->settings[\'name\'], $user->ID ) );
        $markup  = $this->markup_filter( $markup, $old_val );

        print $markup;
    }

    /**
     * Saves the data.
     *
     * @param  int $user_id
     * @return void
     */
    public function save( $user_id )
    {
        if ( ! current_user_can( $this->settings[\'cap_save\'], $user_id ) )
        {
            return;
        }

        $input = empty ( $_POST[ $this->settings[\'name\'] ] )
            ? \'\' : $_POST[ $this->settings[\'name\'] ];
        $input = $this->prepare_input( $input );

        update_user_meta( $user_id, $this->settings[\'name\'], $input );
    }

    /**
     * Prepares the user input. For extensions.
     *
     * @param  string $input
     * @return string
     */
    public function prepare_input( $input )
    {
        return $input;
    }

    /**
     * Prepares the form markup.
     *
     * @param  string $markup
     * @param  string $old_val
     * @return string
     */
    public function markup_filter( $markup, $old_val )
    {
        $old_val = htmlspecialchars( $old_val, ENT_QUOTES, \'utf-8\', FALSE );
        return str_replace( \'%content%\', $old_val, $markup );
    }
}

使用

<?php
add_action( \'init\', \'init_profile_addons\' );
function init_profile_addons()
{
    $GLOBALS[\'extended_author_text\'] = new T5_User_Profile_Addon(
        array (
            \'name\' => \'extended_author_text\'
        ,   \'label\' => \'Second text field\'
        ,   \'description\' => \'<p>This text will be shown at the top of your author archive. You may use HTML.</p>\'
        ,   \'markup\' => \'<table class="form-table"><tr><th>%label%<br /><br />%description%</th>
            <td><textarea name="%name%" id="%id%" rows="10" cols="30">%content%</textarea></td></tr></table>\'
        )
    );
}
示例:复选框在某些情况下,您可能希望扩展类以更改某些行为。在这里,我构建了一个复选框:

/**
 * Template for a simple checkbox.
 */
class T5_User_Profile_Checkbox extends T5_User_Profile_Addon
{
    public function prepare_input( $input )
    {   // Convert the checkbox value to integer
        return \'\' == trim( $input ) ? 0 : 1;
    }

    public function markup_filter( $markup, $old_value )
    {   // Preselect the checkbox if necessary.
        $checked = 1 == $old_value ? \' checked="checked"\' : \'\';
        return str_replace( \'%checked%\', $checked, $markup );
    }
}
我的原始模板系统可能不是最好的方法。没有用户友好的错误处理。我只需要一些有用且容易理解的东西。:)

SO网友:kaiser

/wp-admin/user-edit.php: do_action( \'show_user_profile\', $profileuser );. 尝试将您的呼叫挂接到那里的元数据库。如果不起作用,您应该查看为编辑后屏幕添加了哪些脚本,并将它们也添加到那里。

结束

相关推荐

Custom metabox translation

我已经创建了一个自定义的帖子类型,并添加了一些自定义的元数据库,现在我想知道我在我的网站上使用了什么样的翻译插件?我对它们都没有经验,所以我不知道谁会支持我的自定义元数据库,谁不会。