私は現在、ゼロからカスタムテーマを開発しています。
先週、私はcomment_form()
によって出力されるHTML要素の順序を変更しようとしていました。
私は基本的にPHPを知りません、そしてWordPress Codexを含むその出力のレイアウトをどのように再配列するかをうまくカバーするcomment_form()
に関する情報を見つけることができませんでした。
できればPHPやWordPressの内部動作に精通していなくても、comment_form()
によって出力された要素を並べ替える方法を誰かが説明できますか?
CSSによる要素の位置変更に頼る解決策を提供しないでください。これはあなたが出力をカスタマイズすることを意図した方法ではあり得ません。
これを達成するのに最適な方法がないことがわかった場合、関数が導入される前のように、comment_form()
を使用せずにcomments.php
をカスタマイズすることは可能でしょうか。
次のリンクは私が試した中で最も関連のある方法のいくつかをカバーしています。まったく機能しないか、正しい結果が得られません。
http://freetexthost.com/wplcq61i3d
(申し訳ありませんが、投稿に3つ以上のリンクを直接投稿することはできません。)
ありがとうございました。
コメントテキスト領域は WordPress 4.4の先頭に 移動されました。
一番下にある古い設定を好めばどうなりますか。
author
、url
、およびemail
のコメントフィールドを並べ替える作者、url、emailの表示順序を変更できます。次のものを含むフィールド
/**
* 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;
} );
コメントフォームは以下のように表示されます。
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;
} );
するとコメントフォームが表示されます。
これが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