アーカイブ

get_usersのroleについて

作成しててちょっと躓いたので忘れないように私的メモ。

get_usersは引数渡すことで絞り込み条件を指定が取得が出来ますが
その中の「role」というキー名で’administrator’などを指定することで
目的の権限を絞り込んで取得できます。

ただ、こちらの「role」キーの指定では
一つの権限をそのままSQL条件に入れているだけなので複数に対しての指定が出来ません。
(配列による指定や、,(←カンマ)などによる指定も駄目)

つまりroleでは
=「投稿者と編集者を取り出す・・・」のような指定が出来ないという事です。

解決策

⇒meta_queryを利用する。

$blog_id = get_current_blog_id();
$args = array(
	'meta_query' => array(
		'relation' => 'OR',
		array(
			'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
			'value' => 'author',
			'compare' => 'like'
		),
		array(
			'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
			'value' => 'editor',
			'compare' => 'like'
		)
	)
);
$users = get_users( $args );

・・・こんな感じです。
Ver3.5以降はmeta_queryが使用できるのでそちらを利用します。
まぁget_usersは関数はキー「count_total」をfalseにしてから
WP_User_Query読んでるだけなので最後の行のget_users関数を使わずに

$user_query = new WP_User_Query( $args );
$users = $user_query->results;

でも良いと思います。

wp_list_authorsで特定のユーザーを指定する/特定のユーザーを除外する

wp_list_authorsは投稿者一覧を表示するテンプレートタグですが
Ver3.9からexcludeとincludeのパラメーターがやっと追加されました。
それを設定するとユーザーを指定することが可能です。

例)ユーザーID:1のみ取得する

$args = array(
	'include' => array(1)
);
wp_list_authors($args);
例)ユーザーID:1を除外する

$args = array(
	'exclude' => array(1)
);
wp_list_authors($args);
複数指定の場合はカンマ区切りにしてあげればOK。
例)ユーザーID:1と2と4のみ取得する

$args = array(
	'include' => array(1,2,4)
);
wp_list_authors($args);

上記の説明ではarray使用して配列で指定していますが
文字列のカンマ区切りで渡しても大丈夫です。

本来wp_list_authorsのinclude、excludeは文字列がデフォルトなのですが
wp_list_authors関数は結局その中でget_users関数を使用し、
パラメータを経由しているだけなので
get_users関数のデフォルトである配列を使用して説明しました。

※尚、文字列でもget_usersから後に呼ぶ
wp_parse_id_list関数の中で配列化しています。

マルチブログで他のブログの新着記事一覧を表示する

マルチサイト時に子ブログの最新記事一覧などを
表示させる場合のショートコードを作成しましたので掲載。

function.phpに以下を作成。

コード

///////////////////////////////////////////////
// マルチブログ対応 新着記事一覧
// [multisite_post_list]
// total_posts_per_page・・・totalで取得表示する数:default=20;
// exclude_blogid…除外するブログ番号。default=1
function multisite_post_list_func($atts) {
	global $wpdb;
	global $post;
	
	$s = ( shortcode_atts(array(
		'total_posts_per_page' => 20,
		'exclude_blogid' => 1,
	), $atts) );
	extract( $s, EXTR_SKIP );
	
	$query_args = array(
		'posts_per_page' => intval($total_posts_per_page),
		'order' => 'desc',
		'orderby' => 'date'
	);

	$temp_exclude_blogid = explode(',', $exclude_blogid );
	$exclude_blogid = array_map( "trim", $temp_exclude_blogid );
	
	$post_date = array();
	$post_list = array();
	$sites = get_last_updated();
	
	foreach( $sites as $site ) {
		if ( !in_array($site['blog_id'], (array)$exclude_blogid ) ) {
			switch_to_blog($site['blog_id']);
			
			$custom_query = new WP_Query( $s );
			if( $custom_query->have_posts() ) {
				while ( $custom_query->have_posts()) {
					$custom_query->the_post();
					$post_date[] = $post->post_date;
					$post_list[] = array(
						"link" => get_permalink(),
						"title" => get_the_title('','',false),
						"blog_id" => $site['blog_id'],
					);
				}
			}
			wp_reset_query();
			restore_current_blog();
		}
	}
	
	// 投稿日時で並べ替える
	arsort( $post_date );
	reset( $post_date );

	// 指定個数にカット
	$post_date = array_slice($post_date, 0, intval($total_posts_per_page), true);

	$resword = '';
	$resword .= '<dl class="multisite_post_list">'."\n";
	foreach( $post_date as $key => $value ) {
		$resword .= '<dt>';
		$resword .= '<span class="date">';
		$resword .= mysql2date('Y年m月d日 H時i分',$value, false);
		$resword .= '</span>';
		$resword .= '</dt>'."\r\n";
		$resword .=  '<dd>'."\r\n";
		$resword .= '<a href="'.$post_list[$key]["link"].'" rel="bookmark" title="'.$post_list[$key]["link"].'.">';
		$resword .= $post_list[$key]["title"];
		$resword .= '</a>'."\r\n";
		$resword .= '('.get_blog_option($post_list[$key]["blog_id"], 'blogname').')';
		$resword .= '</dd>'."\r\n";
	}
	$resword .= '</dl>'."\r\n";

	return $resword;
}
add_shortcode('multisite_post_list', 'multisite_post_list_func');

使い方

表示したいページ編集にて(ビジュアルじゃなくテキストで)

[multisite_post_list]

と記述してください。
デフォルトで20件、親であるブログIDの1
が除外されて表示されます。

件数変えたい場合は
total_posts_per_page
という引数を付ける

例)10件にしたい場合
[multisite_post_list total_posts_per_page=”10″]

更にブログで除外したいのがある場合は
exclude_blogid
という引数でブログIDを指定(複数時は,(カンマ)区切り)

例)ブログIDの2,3を除外する場合
[multisite_post_list exclude_blogid=”2,3″]

となります。

補足

あくまで最新記事一覧と言う感じです。
ページングなど本格的に一覧を作成する場合は
SQLから書かないと無理だと思います。
(多分UNION ALLとかで結合して取得???)

末尾にスラッシュを追加する

WordPressには末尾にスラッシュを追加する関数がある。

trailingslashit($string)

この関数を通すとスラッシュを追加して
戻り値が戻ってくる。

逆に取る場合はこの関数。

untrailingslashit($string)

以下は、忘れないようにメモφ(・ω・)

trailingslashit関数の中身はuntrailingslashitして/を足しているだけ。
untrailingslashit関数の中身はrtrimで/を取っているだけ。

今までは自前でやってたのだけど、
せっかく用意しているので使用しよう。

WordPress3.8以降のダッシュボードの列数を変更する

WordPress3.8からダッシュボードの列数が
表示オプションで変えられなくなっていましたので、
その修正方法です。

使用中のテーマのfunctions.phpに以下を追加してください。

function my_screen_layout_dashboard() {
?>
	<style>
	.postbox-container { width: 100% !important };
	.meta-box-sortables.ui-sortable.empty-container { display: none };
	</style>
<?php
}
add_action( 'admin_head-index.php', 'my_screen_layout_dashboard' );

何をしているかというと
単純にスタイルのタグを加えているだけです。

wp_parse_argsを利用する

プラグインなどを作成している人なんかには既知の事だと思いますが、
関数を作成する際にはwp_parse_argsを利用すると便利です。
もし知らない人は是非利用してみてください。

続きを読む

wp_list_categoriesで「カテゴリーなし」を非表示にする

wp_list_categoriesでカテゴリーを取得できなかった場合
「カテゴリーなし」(英語版だと「No categories」)と表示されます。

カテゴリーが取れたか、取れていないか?の判定する際には
strposとかで「No categories」が含まれているのか?
などで調べなくてはなりません。

その判定をもっと単純にする方法です!

続きを読む

パンくずリストを設置

functions.phpに関数に以下を作成。
一応、区切りと最初のトップページの有無が設定できるようにしてみた。
大変見難いソースとなっていますが、今回は一応公開しておきます。
意図的にソースにはコメントを付けておきました。

続きを読む