私は、CSSルールでスタイルを整えるために、各コメントのタイムスタンプを<span>
要素で囲むWordPressテーマを開発しています。しかし、私のテーマのcomments.php
テンプレートで使用している wp_list_comments()
関数 は、生成されるHTMLを変更するオプションを提供していないようです。
<ol class="comment-list">
<?php
wp_list_comments( array(
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
) );
?>
</ol>
そのようなものとしてタイムスタンプを生成します。
<time datetime="2015-12-21T19:09:49+00:00"> december 21st, 2015 on 19:09 </time>
コアファイルを変更せずに、各<span>
要素の周囲に<time>
要素を含めるように関数の出力を変更する方法を教えてください。
私は私のテーマのfunctions.php
、そしてWordPressのwp-includes/comment.php
とwp-includes/comment-template.php
を見てみました。それらのどれもwp_list_comments()
によって生成されたコメントタイムスタンプの実際のタグ構造を扱っていません、それで私が遊ぶためにそこに何もありませんでした。
各コメントのネイティブレイアウトをオーバーライドする方法についていくつかのオプションがあります。
start_el()
のオーバーライドカスタムの wpse コメントフォーマットを定義しましょう。
// Arguments for wp_list_comments()
$args = [
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
];
// Use our custom walker if it's available
if( class_exists( 'WPSE_Walker_Comment' ) )
{
$args['format'] = 'wpse';
$args['walker'] = new WPSE_Walker_Comment;
}
wp_list_comments( $args );
カスタムコメントウォーカーを使用して、この新しいフォーマットを処理します(PHP 5.4以降)。
/**
* Custom comment walker
*
* @users Walker_Comment
*/
class WPSE_Walker_Comment extends Walker_Comment
{
public function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 )
{
// Our custom 'wpse' comment format
if ( 'wpse' === $args['format'] )
{
$depth++;
$GLOBALS['comment_depth'] = $depth;
$GLOBALS['comment'] = $comment;
// Start output buffering
ob_start();
// Let's use the native html5 comment template
$this->html5_comment( $comment, $depth, $args );
// Our modifications (wrap <time> with <span>)
$output .= str_replace(
[ '<time ', '</time>' ],
['<span><time ', '</time></span>' ],
ob_get_clean()
);
}
else
{
// Fallback for the native comment formats
parent::start_el( $output, $comment, $depth, $args, $id );
}
}
} // end class
カスタムコメントフォーマットの処理方法に注意してください。 start_el()
を呼び出すことで、ネイティブフォーマットの 親クラス からのparent::start_el()
メソッドも再利用します。
また、親クラスと同じように、 出力バッファリング を使用することにも注意してください。
html5_comment()
をオーバーライドする次のようにして、ネイティブのWalker_Comment::html5_comment()
メソッドを直接オーバーライドすることもできます。
// Arguments for wp_list_comments()
$args = [
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
];
// Use our custom walker if it's available
if( class_exists( 'WPSE_Walker_Comment' ) )
{
$args['walker'] = new WPSE_Walker_Comment;
}
wp_list_comments( $args );
カスタムウォーカークラスは次のように定義されています。
/**
* Custom comment walker
*
* @users Walker_Comment
*/
class WPSE_Walker_Comment extends Walker_Comment
{
public function html5_comment( $comment, $depth, $args )
{
// Place the modifications of the Walker_Comment::html5_comment() method here
}
} // end class
ここで、 Walker_Comment::html5_comment()
メソッドへの変更を保存することができます。かなり長いので、ここでは追加しませんでした。
ここではcallback
属性を使います。
// Arguments for wp_list_comments()
$args = [
'style' => 'ol',
'format' => 'html5',
'short_ping' => true,
];
// Use our custom callback if it's available
if( function_exists( 'wpse_comment_callback' ) )
{
$args['format'] = 'wpse';
$args['callback'] = 'wpse_comment_callback';
}
wp_list_comments( $args );
wpse_comment_callback()
をニーズに合わせて定義します。
/**
* Custom comment callback
*/
function wpse_comment_callback( $comment, $depth, $args )
{
// Modify the Walker_Comment::html5_comment() method to our needs
// and place it here
}
Walker_Comment::html5_comment()
メソッドをシミュレートすることから始めましょう。しかし、すべての参照を$this
に置き換えることを忘れないでください。
他にも利用できるアプローチがありますが、うまくいけばあなたはこれらをあなたのニーズに合わせることができます。