WordPress

WordPress のコアファイルで見つけたカッコイイ PHP コードの書き方・関数のまとめ

TABLEofCONTENTS

ワンランク上のコーダー()っぽく見えるのでモテること請け合い。

PHP コード

while ( $term = array_shift($terms) )
  $_terms[] = $term->name;

get_terms() in wp-includes/taxonomy.php

タームオブジェクトの配列から必要な値(上記ではターム名)のみを配列に入れています。array_shift() でオブジェクトを順に取得しつつ while の条件式にしているところがカッコイイですね。カスタム投稿タイプオブジェクトを取得して slug => label の配列を作る時などにも便利な書き方です。WordPress Coding Standards 的に大丈夫なのかな?と思いましたがセーフみたいです。

試しに速度を計測してみたところ、普通に foreach でループさせた方が速かったです。このコはカッコだけでした、ぐぬぬ。

get_current_screen()->add_help_tab( 〜 );

in wp-admin/edit.php

オブジェクトを返す関数から直接プロパティやメソッドにアクセスします。一旦変数に代入するまでもないなら、この書き方で十分ですね。

function __construct( $manager, $id, $args = array() ) {
  $keys = array_keys( get_class_vars( __CLASS__ ) );
  foreach ( $keys as $key ) {
    if ( isset( $args[ $key ] ) )
      $this->$key = $args[ $key ];
  }

WP_Customize_Section::__construct() in wp-includes/class-wp-customize-section.php

$args の連想配列でオブジェクトのプロパティ値を設定します。カッコイイ。

printf( '<a href="%1$s">%3$s</a>',
  esc_url( get_comment_link( $comment->comment_ID ) ),
  get_comment_time( 'c' ),
  /* translators: 1: date, 2: time */
  sprintf( __( '%1$s at %2$s', 'twentytwelve' ), get_comment_date(), get_comment_time() )
);

in wp-content/themes/twentytwelve/functions.php

PHP の値と HTML をあわせて出力するときは、<?php ?> で HTML/PHP を切り替えたり、echo で文字列と値を連結するケースが多いですが、いずれも見難いコードになってしまいます。printf/sprintf を使えば、一気に見やすくメンテナンスしやすいコードになりますよ。

/* translators: If there are characters in your language that are not supported
  by Open Sans, translate this to 'off'. Do not translate into your own language. */
if ( 'off' !== _x( 'on', 'Open Sans font: on or off', 'twentytwelve' ) ) {

in wp-content/themes/twentytwelve/functions.php

メッセージカタログ(po/mo ファイル)の記述を config 的な設定値として利用しています。カッコよすぎてシビレますね…

WordPress の便利関数

WordPress には気の利いた便利でマイナーな関数がたくさんあります。ここではさりげなく使うとカッコイイ関数をいくつか紹介します。

フィルターにお決まりの値を返す

フィルターフックで false array() などありがちな値を返す場合、自分でわざわざフック用の関数を作らなくても既に WordPress に用意されています。

__return_true()
__return_false()
__return_zero()
__return_empty_array()
__return_null()

in wp-includes/functions.php

使い方は以下のとおり。シンプルでカッコイイですね。

add_filter( 'filter_name', '__return_true' );

日時関連

current_time( $type, $gmt = 0 )

current_time() in wp-includes/functions.php

PHP の time()date() を使って「9時間ずれてるー!」となった経験は誰しもあると思います。これは管理画面の一般設定「タイムゾーン」で指定した現在日時を取得できる関数です。date_i18n()も内部でこの関数を使っています。

参考:関数によって取得される現在日時の違い
time() 1500575073
current_time( ‘timestamp’ ) 1500607473
date( ‘Y-m-d H:i:s’ ) 2017-07-20 18:24:33
current_time( ‘mysql’ ) 2017-07-21 03:24:33

$gmttrue にすると Unix タイムスタンプになります。

human_time_diff( $from, $to = '' )

human_time_diff() in wp-includes/formatting.php

引数に日時を与えると「5分(前)」「2時間(前)」「3日(前)」などの期間表示を返します。管理画面の記事一覧ページの「日時」カラムで使用されていますね。なんと WP 1.5 の時代からあるみたいです。Twitter にインスパイアされたのかと思ってました。

フォーム関連

checked( $checked, $current = true, $echo = true )
selected( $selected, $current = true, $echo = true )
disabled( $disabled, $current = true, $echo = true )

checked(), selected(), disabled() in wp-includes/general-template.php

input 要素などの属性値を簡単に出力できます。if や三項演算子で見難くなりがちなコードをこれらの関数でスッキリ書けます。地味に便利ですね。

absint( $maybeint )

absint() in wp-includes/functions.php

引数の整数の絶対値を返します。PHP の関数だと思ってました… サニタイズ時に使うと intval() より厳密な感じがしますね。

ベタ書き防止

文字列連結などをベタ書きするより「何をしているのか」を明示する関数を使う方がセマンティックで思慮深そうに見えます。

trailingslashit( $string )

trailingslashit() in wp-includes/formatting.php

$string の最後にスラッシュが付いていてもいなくても、確実に1つだけスラッシュを付けます。安易に . '/' とすると string// となることがあるのでこの関数を使いましょう。関数名が長いのは気にしないでください…

path_join( $base, $path )

in wp-includes/functions.php

rtrim($base, '/') . '/' . ltrim($path, '/') を返します。パスの連結をベタ書きするよりスマートですね。

zeroise( $number, $threshold )

zeroise() in wp-includes/formatting.php

指定した桁数になるよう数字の前に0をパディングします。0詰めをベタ書きするよりクレバーですね。

カッコイイ関数

関数そのものがカッコイイですよ。

wp_filter_object_list( $list, $args = array(), $operator = 'and', $field = false )

wp_filter_object_list() in wp-includes/functions.php

オブジェクト配列の中から、条件に合うオブジェクトを抽出します。get_post_types() の内部でも使われていますね。これを使っているとすごい人に見えます。

セマンティックな定数

define( 'MINUTE_IN_SECONDS', 60 );
define( 'HOUR_IN_SECONDS',   60 * MINUTE_IN_SECONDS );
define( 'DAY_IN_SECONDS' ,   24 * HOUR_IN_SECONDS   );
define( 'WEEK_IN_SECONDS',    7 * DAY_IN_SECONDS    );
define( 'YEAR_IN_SECONDS',  365 * DAY_IN_SECONDS    );

in wp-includes/default-constants.php

1日を秒数で指定するときは 60 * 60 * 24 より DAY_IN_SECONDS の方がわかりやすくてカッコイイですね。

デバッグに使えるコード

WordPress コアファイルではありませんが、Debug Bar, Debug-Bar-Extender などのデバッグ用プラグインを使いこなしているとカッコイイですね。

Debug_Bar_Extender::instance()->trace_var( $value, $var_name = false )

変数の値を <pre /> 付き var_dump() で確認できます。var_dump() の代替以上の使い勝手ですよ。実際に使う場合は、プラグインが停止されていてもエラーにならないように if ( class_exists( 'Debug_Bar_Extender' ) ) で判定をしましょう。

Debug Bar 関連情報

番外編

使いどころがわからない関数や不要かもしれない関数も結構あります。カッコよくないかもしれないので注意してください。

is_new_day()

is_new_day() in wp-includes/functions.php

一覧表示時(ループ中)に記事の公開日付が変わったかどうかを判定するようですが、どこからも使われていません。ちなみに the_date() 内部で関連するグローバル変数を操作していて、そこで new day 判定も直接しています。何故 is_new_day() を使わない…

まとめ

これらの他にも antispambot() size_format() ファイル操作関数など、個人的には使う機会がないですが、いざ必要となったときにあると便利な関数やコードのヒントが WordPress にはたくさんあります。ソースや Codex を眺めていると新たな発見があるかもしれませんよ。以上、全然まとめきれていませんがこの辺りで失礼します。

ではまた。