ワードプレスで投稿者一覧を表示したくなったので、ショートコードを作成しました。
※PHPの基礎は知っている前提です。拙著WordPressユーザーのためのPHP入門をごらんください。
WordPressでは、記事の中でプログラムを実行したい、といった場合でも、標準ではt投稿中にプログラムコードを書いても無効になります。プログラムを書きたい場合は、
(1)(テーマのfunctions.php・あるいはプラグインとして)あらかじめプログラムコードを書いておく
(2)投稿では呼び出すコード名を指定する
となっています。
この仕組みのことをショートコードと呼びます。(記事に挿入するコードのことをショートコードと呼ぶこともあります。)
ショートコードを作るときは、(1)コード作成が必要です。この作業はさらに2つに分けられます。
(A)実行する関数を作る
(B)コードをショートコードとして登録する
<?php
// (A)
function sample_function() {
// ここにコードを書く
}
// (B)
// ↓ 実行する関数
add_shortcode( 'abcde', 'sample_function');
// ↑ショートコードで呼び出すときの名前
投稿では、(2)呼び出すコード名を指定します。手順は、
(C)ショートコードブロックを選ぶ
(D)[abcde]と書く
です。
以下のようなコードを書きました。
<?php
// user をショートコードで出力する
function ounziw_userlist_shortcode( $atts ) {
$atts = shortcode_atts( [
'size' => '96', // 画像サイズ
'orderby' => 'rand', // ランダムに並べる
'order' => 'ASC' // 並び順
], $atts );
$args = [ // ユーザーを取得する設定(どんな条件で抽出するか)
'size' => $atts['size'],
'orderby' => $atts['orderby'],
'order' => $atts['order'],
'role__in' => ['Contributor', 'Author', 'Editor'] // 寄稿者、投稿者、編集者
];
$user_query = new WP_User_Query( $args ); // ユーザーを取得する処理
$items = '';
foreach ( $user_query->results as $user ) { // ユーザー一人ずつ順に処理していく
$items .= sprintf(
'<div class="c-row__col c-row__col--1-2 c-row__col--md-1-4"><a href="%s" title="%s">%s</a>
</div>', // テーマのcss classを指定してHTMLを生成する
esc_url( get_author_posts_url( $user->ID, $user->user_nicename ) ),
esc_attr( $user->display_name ),
get_avatar( $user->ID, $atts['size'], '', $user->display_name )
);
}
return sprintf(
'<div class="c-row">%s</div>',
$items
);
}
add_shortcode( 'ounziw_userlist', 'ounziw_userlist_shortcode' );
上の記述で、ユーザー一覧をショートコード化できました。
デフォルトではユーザー一覧をランダム順にするオプションは無かったので、https://stackoverflow.com/questions/33538624/how-to-random-order-a-user-list-with-get-users を参考にフックを追加しました。
// ランダム表示のオプションを追加するフック
// https://stackoverflow.com/questions/33538624/how-to-random-order-a-user-list-with-get-users
function my_random_user_query( $class ) {
if ( 'rand' == $class->query_vars['orderby'] ) {
$class->query_orderby = str_replace( 'user_login', 'RAND()', $class->query_orderby );
}
return $class;
}
add_action( 'pre_user_query', 'my_random_user_query' );
こうすることで、ユーザー一覧をランダム表示するショートコードが完成しました。
実際に活用しているページは↓サイト概要-ブックレコメンドをごらんください。
他の記事もごらんください。