カスタムフィールド値の重複をチェック

ワードプレスPHPカスタムフィールド条件分岐管理画面

「カスタムフィールド値にダブりがないか?」のチェックが必要になったので考えてみました。商品IDにダブりがないか、とか。

 

投稿入力時に「すでに存在するIDです」とアラートを出せればベストなのですが、今の知識では無理でした。

 

以下、投稿タイプ「item」で、カスタムフィールド「item_id」にダブりがあったらその値を出す、という感じです。

1:任意の場所に一覧表示

<?php
$args = array(
	'post_type'			=> 'item'
);
$item_ids[] = '';
$query = new WP_Query( $args );
if( $query->have_posts() ){
	echo '<h3>■商品ID重複アラート</h3>';
	while( $query->have_posts() ){
		$query->the_post();
		if( get_post_meta( $post_id, 'item_regist', true ) ){
			$item_id = strip_tags( str_replace( array( "\r\n" , "\r" , "\n" , " " , " " ), '', get_post_meta( $post_id, 'item_regist', true ) ) );
			if( in_array( $item_id, $item_ids ) ){
				echo '<p>' . $item_id . 'は登録済みです。</p>';
			}else{
				$item_ids[] = $item_id;
			}
		}
	}
	wp_reset_postdata();
}
?>

出力場所は任意。ダッシュボードとか。

HTMLタグ、全角・半角スペース、改行コードは取り除いていますが、「-」と「ー」などは区別しちゃうのであくまで目安程度。

半角英数だけなら何とかなると思いますが、漢字も使うフィールドだったのできれいにあきらめ。

2:管理画面の投稿一覧にカラムを追加して表示

<?php
/* ---------- 一覧にカラム追加 - 投稿タイプ【商品】 カスタムフィールド【商品ID】 ---------- */
function add_posts_column_item( $column ){
	$column[ 'item_regist' ] = '商品ID';
	return $column;
}
add_filter( 'manage_item_posts_columns', 'add_posts_column_item' );
function mod_posts_column_item( $column_name, $post_id ){
	$item_regists[] = '';
	$args = array(
		'post_type'			=> 'item',
	);
	$query = new WP_Query( $args );
	if( $query->have_posts() ){
		while( $query->have_posts() ){
			$query->the_post();
			if( get_post_meta( $post_id, 'item_regist', true ) ){
				$item_regist = strip_tags( str_replace( array( "\r\n" , "\r" , "\n" , " " , " " ), '', get_post_meta( $post_id, 'item_regist', true ) ) );
				$item_regists[] = $item_regist;
			}
		}
	}
	$counts= array_count_values( $item_regists );
	if ( $column_name == 'item_regist' ) {
		$item_regist = strip_tags( str_replace( array( "\r\n" , "\r" , "\n" , " " , " " ), '', get_post_meta( $post_id, 'item_regist', true ) ) );
		echo ( $item_regist ) ? $item_regist : '-';
		if( $counts[$item_regist] > 1 ){
			echo '<br><span style="color: #F00; font-weight: bold;">重複しています!</span>';
		}
	}
}
add_action( 'manage_item_posts_custom_column', 'mod_posts_column_item', 10, 2 );
?>

 

編集画面でのアラートはリアルタイムで出す必要があるのでjava scriptを使うのかな?

カートシステムのプラグインあたりを調べればわかるか。

そのうち考えてみよう。