web-dev-qa-db-ja.com

Wordpressの「作者」とは何ですか?また、作者の「メタボックスクラス」はどこかにありますか?

私は自分のウェブサイトのテーマで自分の「プロフィール」ページをカスタマイズする機能をユーザーに提供したいという新しいプロジェクトの概要を説明しようとしています。独自の背景画像を追加する、テンプレートを選択するなどの概念.

それが各ユーザーのためのユニークな情報を格納する唯一のテーブルであるように思われるので、著者メタにこの情報を格納することは私にとって論理的に思えました。入力ボックスを設定したら、テーマで簡単に電話をかけることができます。

ユーザーはポストタイプや分類法のようには見えませんが、私が彼らの「本当の」存在を理解することはできません。 WordPressから見た「ユーザー」とは何かを説明するのに、少し時間がかかることがありますか。

私が最終的に望んでいたのは、編集著者プロフィールページにメタボックスを簡単に追加できるクラスを見つけることです。

フォームを介してプロファイルフィールドを拡張する方法はわかりますが、もっと柔軟なものを探しています。

*私は自分の投稿タイプにfarinspaceメタボックスクラスを使っていて、それがどのように機能するかがとても気に入っています。

これのいずれかが可能ですか、または私が取るべきよりよいルートがありますか。

1
shawn

著者はWordPressのかなり単純なコンテンツオブジェクトです。彼らは 役割と能力 、いくつかの基本的なメタデータとそれら自身の編集スクリーンを持っています。それで結構です。カスタム分類法を著者に追加したい場合は、著者オブジェクトが分類法をサポートしていないため、各ユーザを(非表示の)カスタム投稿タイプでミラー化する必要があります。

とにかく…メタボックスのために私は簡単なクラスを書きました。私はそれが物事がどのように機能するかそしてどこに引っ掛かるべきかを理解するのに役立つことを願っています。

クラスT5_User_Profile_Addon

<?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 );
    }
}

私の原始的なテンプレートシステムは最善の方法ではないかもしれません。ユーザーフレンドリーなエラー処理はありません。うまく機能し、理解しやすいものが必要でした。 :)

2
fuxia

/wp-admin/user-edit.phpdo_action( 'show_user_profile', $profileuser );。そこでメタボックスへの呼び出しをフックしてみてください。うまくいかない場合は、編集後の画面に追加されるスクリプトを調べて、そこに追加する必要があります。

1
kaiser