web-dev-qa-db-ja.com

Comment_form()によって出力された要素を並べ替える

私は現在、ゼロからカスタムテーマを開発しています。

先週、私はcomment_form()によって出力されるHTML要素の順序を変更しようとしていました。

私は基本的にPHPを知りません、そしてWordPress Codexを含むその出力のレイアウトをどのように再配列するかをうまくカバーするcomment_form()に関する情報を見つけることができませんでした。

できればPHPやWordPressの内部動作に精通していなくても、comment_form()によって出力された要素を並べ替える方法を誰かが説明できますか?

CSSによる要素の位置変更に頼る解決策を提供しないでください。これはあなたが出力をカスタマイズすることを意図した方法ではあり得ません。

これを達成するのに最適な方法がないことがわかった場合、関数が導入される前のように、comment_form()を使用せずにcomments.phpをカスタマイズすることは可能でしょうか。

次のリンクは私が試した中で最も関連のある方法のいくつかをカバーしています。まったく機能しないか、正しい結果が得られません。

http://freetexthost.com/wplcq61i3d

(申し訳ありませんが、投稿に3つ以上のリンクを直接投稿することはできません。)

ありがとうございました。

3

コメント欄の並べ替え

コメントテキスト領域WordPress 4.4の先頭に 移動されました。

default 4.4

一番下にある古い設定を好めばどうなりますか。

authorurl、およびemailのコメントフィールドを並べ替える

作者urlemailの表示順序を変更できます。次のものを含むフィールド

/**
 * Re-arranging the author, url and email comment fields
 */
add_filter( 'comment_form_defaults', function( $defaults )
{
    $_defaults = [];

    // Re-arrange the fields to your needs:
    $fields = [ 'author', 'url', 'email' ];

    foreach( $fields as $field )
        $_defaults['fields'][$field] = $defaults['fields'][$field]; 

    return $_defaults;
} );

しかし、コメントテキスト領域送信ボタンを並べ替えるための別のアプローチを見つける必要があります。

カスタム回避策

5つのコメントフィールドすべてを並べ替えるには、カスタムのwpse_comment_fieldsフィルタを使用します。

add_filter( 'wpse_comment_fields', function( $fields )
{       
    return $fields;
} );

functions.phpファイルまたはプラグインにあります。

例:先頭のAuthorフィールド

authorフィールドを一番上に移動しましょう。

/**
 * Display the 'author' comment field at top:
 */
add_filter( 'wpse_comment_fields', function( $fields )
{
    // Re-arrange fields
    $fields = [ 'author', 'comment', 'url', 'email', 'submit' ];

    return $fields;
} );

コメントフォームは以下のように表示されます。

custom 1

例:下部のCommentフィールドとUrlフィールドの削除

ここでは、下部にコメントフィールドを表示し、urlフィールドを削除します。

/**
 * Display the 'comment' field at the bottom and remove the 'url' field:
 */
add_filter( 'wpse_comment_fields', function( $fields )
{
    // Re-arrange fields
    $fields = [ 'email', 'author', 'comment', 'submit' ];

    return $fields;
} );

するとコメントフォームが表示されます。

custom 2

デモプラグイン

これがwpse_comment_fieldsフィルタをサポートする私たちのデモプラグインです(PHP 5.4以降):

<?php
/**
 * Plugin Name: Rearrange Comment Fields
 * Plugin URI:  http://wordpress.stackexchange.com/a/207449/26350
 * Author:      Birgir Erlendsson (birgire)
 * Description: Support for rearranging the comment fields: 'comment', 'auhtor', 'url', 'email' and 'submit' through the 'wpse_comment_fields' filter.
 * Version:     0.0.1
 */

add_action( 'comment_form_before', function()
{
    if( class_exists( 'WPSE_Rearrange_Comment_Fields' ) )
    {
        $fields = apply_filters( 
            'wpse_comment_fields', 
            [ 'comment', 'author', 'url', 'email', 'submit' ]
        );

        $o = new WPSE_Rearrange_Comment_fields;
        $o->set_fields( $fields )
          ->init();
    }
});

class WPSE_Rearrange_Comment_Fields
{
    private $html       = [];
    private $defaults   = [];
    private $fields     = [];

    public function set_fields( array $fields )
    {
        $this->fields = $fields;
        return $this;
    }

    public function init()
    {
        // Default
        $this->defaults = [ 'comment', 'author', 'url', 'email', 'submit' ];

        // Check for defaults
        if( empty( $this->fields ) )
            $this->fields = $this->defaults;

        // Hooks
        add_action( 'comment_form',                 [$this, 'display'],                     PHP_INT_MAX );
        add_filter( 'comment_form_field_comment',   [$this, 'comment_form_field_comment'],  PHP_INT_MAX );
        add_filter( 'comment_form_submit_field',    [$this, 'comment_form_submit_field'],   PHP_INT_MAX );
        foreach( [ 'author', 'url', 'email' ] as $field )
            add_filter( "comment_form_field_{$field}",  [$this, 'comment_form_field'], PHP_INT_MAX );       
    }

    public function display()
    {
        // Display fields in the custom order                   
        $html = '';
        foreach( (array) $this->fields as $field )
        {
            if( in_array( $field, $this->defaults ) ) 
                $html .= $this->html[$field]; 
        }
        echo $html;
    }

    public function comment_form_submit_field( $submit_field )
    {
        $this->html['submit'] = $submit_field;
        return '';
    }

    public function comment_form_field_comment( $comment_field )
    {
        $this->html['comment'] = $comment_field;
        return '';
    }

    public function comment_form_field( $field )
    {
        $key = str_replace( 'comment_form_field_', '', current_filter() );
        $this->html[$key] = $field;
        return '';
    }

} // end class
2
birgire