WordPressのエディタでBボタンをStrongではなくBタグにするプラグイン

WordPressの投稿や固定ページの本文を編集する、ビジュアルエディタとテキストエディタで、Bボタンをクリックすると、Strongタグになります。同様に、Iボタンをクリックすると、emタグになりますが、これらは、装飾的に使うべきではないタグなので、bタグとiタグにしたいときがあります。

そんなときのために、さくっとインストールするだけの、便利なプラグインを作りました。

BI Button Changer

今回、作ったプラグインを、WordPressの公式ディレクトリに、はじめて登録しました。
プラグインの内容としては、

【解決】WordPressのビジュアルエディタでBとIがstrongとemタグになってしまう

の内容と全く同じです。

使い方は、ただプラグインをインストールするだけ。
それだけで、ビジュアルエディタとテキストエディタで、Bボタンをクリックするとbタグ、Iボタンをクリックするとiタグになります。

WordPressプラグインディレクトリへの登録

プラグインの作り方は、こちらを参考にするとわかりやすいです。
http://oxynotes.com/?p=9321
http://www.webopixel.net/wordpress/631.html

プラグインディレクトリへの登録方法は、こちらを参考にさせていただきました。
http://oxynotes.com/?p=9436
https://yyengine.jp/blog/yyengine/wp-plugin-add/

ありがとうございましたー

 

 

 

WordPressでメディアのURLを取得する

WordPressでは、アップロードした画像や動画などは、メディアとして管理されます。

投稿や固定ページに貼り付けた画像などは、「添付した画像」などといいます。

「メディア」で管理することができますが、基本的には投稿や固定ページに添付されていることが前提なことがおおいですが、そうではなくて、メディアの中から特定の画像を一覧で表示したいときがありあす。

そんなときは、WP_Queryで取り出して表示するのがいいです。

画像の一覧を取得する

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$terms = get_terms( 'tenant-category', '' );
$the_query = new WP_Query( 
	array(
		'post_status' => 'any',
		'post_type' => 'attachment' ,
		'post_mime_type' => 'image' ,
		'posts_per_page' => 12 ,
		'nopaging' => false, 
		'paged' => $paged,
		'tax_query' => array(
			array(
				'taxonomy' => 'media_category',
				'field'	   => 'slug',
				'terms'	   => 'contest',
			)
			)	
		)
	);

if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post(); 
		
	the_attachment_link( $the_query->post->ID ); //メディアをリンク付きで出力する

	echo wp_get_attachment_link( $the_query->post->ID , 'thumbnail' ); //メディアへのリンクをHTML付きで返す

	echo wp_get_attachment_url( $the_query->post->ID ); //メディアのURLを返す
	
	$images = wp_get_attachment_image_src( $the_query->post->ID, 'medium' ); //添付された画像のURLとサイズを配列で返す
	echo '<img src="' . $images[0] . '" width="' . $images[1] . '" height="' . $images[2] . '"/>';

endwhile;
else: 
endif;
wp_reset_query();

WP_Queryのpost_typeにattachmentを指定して取り出します。

the_attachment_link を使うと、HTMLタグごと出力してくれるので、ただ貼り付けるだけで画像を出力してくれます。が。出力サイズをフルサイズかサムネイルしか選べないので、
wp_get_attachment_link をったほうが便利です。

ただ、もうちょっと細かいことがしたかったら、URLを直接取得してタグは自力でかいたほうがいいこともあります。そんなときは、wp_get_attachment_url を使います。
あるいは、wp_get_attachment_image_src を使うと、画像のURLとサイズを配列で取得できます。

カテゴリに指定されたものだけ取得する

メディアにカテゴリをつけていた場合、そのカテゴリで出力する画像を指定できます。

WP_Queryのargsを次のようにtax_queryを追加します。

$the_query = new WP_Query( 
	array(
		'post_status' => 'any',
		'post_type' => 'attachment' ,
		'post_mime_type' => 'image' ,
		'posts_per_page' => 12 ,
		'nopaging' => false, 
		'paged' => $paged,
		'tax_query' => array(
			array(
				'taxonomy' => 'media_category',
				'field'	   => 'slug',
				'terms'	   => 'contest',
			)
			)	
		)
	);

固定ページや投稿ページに使われている画像を取得する

特定の固定ページや投稿ページに使われている(添付されている)画像を取得したいときは、get_attached_media を使います。以下の例では、get_the_ID を使っているので、ループの中で使います。

if ( have_posts() ) while ( have_posts() ) : the_post();

	$medias = get_attached_media( 'image', get_the_ID() );
	foreach($medias as $media){
		the_attachment_link( $media->ID );
	}

endwhile;

【解決】WordPressのビジュアルエディタでBとIがstrongとemタグになってしまう

【追記】プラグイン化しました。BI Button Changer

詳しくはこちら→WordPressのエディタでBボタンをStrongではなくBタグにするプラグイン

 

WordPressのビジュアルエディタは本当に便利でありがたい限りですが、大きなお世話なところも少なからずあるわけで。

その中で、もっともよろしくないと思うのが、Bボタンと、Iボタン。

Bはボールドで太文字になるので、当然bタグがあてがわれると思っていたら、strongタグになってしまいます。

Iも同様に、イタリックで斜体になるので、iタグがあてがわれると思ったら、emタグになってしまいます。

strongやemは、h1,h2などの見出しタグ同様、検索エンジンは重要なワードとして認識する。ゆえに適材適所で使う分にはいいが、乱発すると「意図的に検索エンジンをだまそうとしている」のような受け止められ方をされて、ペナルティを受ける場合がある。よって、strongタグやemタグを乱用するのはSEO上よろしくない。
みたいに言われています。

にもかかわらず、ワンクリックでstrongとemが使えてしまうので、これを知らずにガンガン使うとまずいので、BボタンやIボタンは、実質ほとんど使いません。

そんなことをわかっている人はいいのですが、SEOという言葉すら知らないクライアントさんにお渡しする際には、これは非常にまずいわけです。

なので、これまではAddQuicktag を使ったり、Visual Editor Custom Buttons をつかって、「BボタンとかIボタンは使わずに、こっちを使ってください。なぜなら、SEOという考え方があって、うんたらかんら・・・」という説明をしていたわけですが、いい加減どうにかならないか、と一念発起して、調べてたらこんな方法が。

http://wordpress.stackexchange.com/questions/168182/should-the-wp-post-editor-b-bold-button-be-inserting-a-b-tag-instead-of-str

早速やってみました。

ビジュアルエディタのBボタンとIボタンの出力を変更

function.phpあたりに、以下をいれます。

function modify_formats($settings){
   $formats = array(
     'bold' => array('inline' => 'b'),
     'italic' => array('inline' => 'i')
    );
    $settings['formats'] = json_encode( $formats );
    return $settings;
}
add_filter('tiny_mce_before_init', 'modify_formats');

するとどうでしょう!
Bボタンでbタグ、Iボタンでiタグにばっちりなってますね!

テキストエディタのBボタンとIボタンを変更

ただ、テキストエディタでは、相変わらずstrongとemなので、こっちも変えたい。

そこで、functioni.php 以下を追加します。
テキストエディタでは、置き換える方法がわからなかったので、一旦既存のBとIボタンは取り除きます。quicktags_settings フックで、strongとemがない状態にします。

//テキストエディタから、strongとemボタンを除く
function default_quicktags($qtInit) {
  //$qtInit['buttons'] = 'link,em,strong,block,del,ins,img,ul,li,ol,code,more,spell,close,fullscreen';//こっちがデフォルト
  $qtInit['buttons'] = 'link,block,del,ins,img,ul,li,ol,code,more,spell,close,fullscreen';
  return $qtInit;
}
add_filter('quicktags_settings', 'default_quicktags', 10, 1);

それから、admin_print_footer_scripts フックで、JSを追加して、bとiボタンを追加します。

//テキストエディタにBとIボタンを追加
function appthemes_add_quicktags() {
    if (wp_script_is('quicktags')){
?>
    <script type="text/javascript">
        QTags.addButton( 'eg_bold', 'B', '<b>', '</b>', 'b', 'ボールド', 1 );
	QTags.addButton( 'eg_i', 'I', '<i>', '</i>', 'i', 'イタリック', 2 );
    </script>
<?php
    }
}
add_action( 'admin_print_footer_scripts', 'appthemes_add_quicktags' );

これで、大丈夫なはず。

すでに使ってしまったstrongタグとemタグをフロント出力時に置換

あと、すでに散々strongタグやemを使いまくってしまった、という場合には、表示するときにbとiタグに置換する方法もあります。同じくfunction.phpに以下をいれます。(ただし、strongタグやemタグを意図して使いたくても置換されていまいます。)

//strongタグをbタグに置換
function change_b_to_strong($content){
    $content = str_replace('<strong>', '<b>', $content);
    $content = str_replace('</strong>', '</b>', $content);
    return $content;
}
add_filter( 'the_content', 'change_b_to_strong' );

BボタンとIボタンをクリックしたときに、bタグ、iタグにする方法まとめ

function.phpに以下をまるっと入れれば、Bボタンを押してもstrongタグにならずにbタグに。Iボタンを押しても、emタグにならずにiタグになります。

//ビジュアルエディタのbボタンとiボタンをbタグとiタグに置き換える
function modify_formats($settings){
   $formats = array(
     'bold' => array('inline' => 'b'),
     'italic' => array('inline' => 'i')
    );
    $settings['formats'] = json_encode( $formats );
    return $settings;
}
add_filter('tiny_mce_before_init', 'modify_formats');

//テキストエディタから、strongとemボタンを除く
function default_quicktags($qtInit) {
  //$qtInit['buttons'] = 'link,em,strong,block,del,ins,img,ul,li,ol,code,more,spell,close,fullscreen';//こっちがデフォルト
  $qtInit['buttons'] = 'link,block,del,ins,img,ul,li,ol,code,more,spell,close,fullscreen';
  return $qtInit;
}
add_filter('quicktags_settings', 'default_quicktags', 10, 1);

//テキストエディタにBとIボタンを追加
function appthemes_add_quicktags() {
    if (wp_script_is('quicktags')){
?>
    <script type="text/javascript">
        QTags.addButton( 'eg_bold', 'B', '<b>', '</b>', 'B', 'ボールド', 1 );
	QTags.addButton( 'eg_i', 'I', '<i>', '</i>', 'B', 'イタリック', 2 );
    </script>
<?php
    }
}
add_action( 'admin_print_footer_scripts', 'appthemes_add_quicktags' );

参考サイト

クイックタグAPI

https://wpdocs.osdn.jp/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BF%E3%82%B0API

 

テキストエディタから、クイックタグボタンをつけたり外したりする方法

http://myownhomeserver.com/2011/10/wordpress-addremove-quicktags-simple-editor-buttons-in-3-3/

 

さくらインターネットでドメイン設定ができない

あるクライアントさんから、さくらインターネットさんを利用しているが、ドメインを取得しても登録できない、という相談があり対応しました。

さくらインターネットの会員ページから、独自ドメインの取得をすませ、レンタルサーバーのコントロールパネルからドメインの設定をしようとするのですが、「指定されたドメイン名は登録されています」となります。

指定されたドメイン名は登録されています

もちろん、他ではつかっていません。

で、さくらインターネットに問い合わせたところ、

現在の設定を調査いたしましたが、[toyonaka-souseijuku.org]のゾーン
情報が残っておりますため、以下を参考の上、ゾーン情報の削除作業を
お願いいたします。

▼ゾーン情報の削除
https://help.sakura.ad.jp/hc/ja/articles/206207381#ac040

ゾーン情報の削除後、必ず2時間経過いたしましてから、先に親ドメイン
[toyonaka-souseijuku.org]をサーバに設定いただき、サブドメインが
必要である場合は、その後サーバへ設定ください。

※ドメインは設定後、インターネット全体に行き渡るまで数時間から
 48時間程度かかる場合がございます。 

ということで、早速クライアントさんにお願いして、

https://help.sakura.ad.jp/hc/ja/articles/206207381#ac040

こちらを参考に、「ゾーン情報の削除」をしてもらいました。

その後、無事ドメインを設定できました。

 

Advanced Custom Fields でカスタムフィールドの値が更新できない

前置き

大量のデータを一括で入れたいとき、Really Simple CSV Importer が便利なのですが、
さらに、画像も一括で取り込みたいときは、Really Simple CSV Importer Media Plus を使うと幸せになれるわけです。

ついでに、カスタムフィールドも Advanced Custom Fields を使っていて、あらかじめ、サーバー上にまとめて画像を上げておいて、それを一括で取り込むようにエクセルなんかでCSVファイルを用意して、一気呵成に取り込んだわけですが、ここから本題。

本題

Advanced Custom Fields で用意しておいた、画像のフィールド、たとえば photo2 としましょう。
そこに一括で画像を登録するところまではうまくいったのですが、どういうわけか、WordPressの管理画面から、なんどやっても内容を更新できなくなっていることに気が付きました。

管理画面では、カスタムフィールドの画像はきれいに入れ替わっているはずなのに、フロント側では表示されなかったり、古いままの画像が表示されたり。

これはいったいなんだ。と延々と悩んだ末、とんでもない結末が。。。

結論

1612270001

もう、なんだか大変申し訳無い気持ちでいっぱいなのですが、カスタムフィールド名の前に、半角の空白が、ひっそりと入っていました。

この空白をクリアすればそれだけで問題は解決。

ぐはぁ。

なぜ、これに気がついたかというと、カスタムフィールドの値が格納されている、wp_postmetaテーブから、投稿(カスタム投稿)に関連するデータをぜんぶ引っ張り出してみる。こんなかんじで。

 

<?php
	if (is_user_logged_in()){
	    global $wpdb;
	    $sql = "SELECT * FROM $wpdb->postmeta WHERE post_id=" . $post->ID;
	    $results = $wpdb->get_results( $sql, OBJECT );
	    print_r($results);
	}
?>

これをsingle.php なりに貼り付けてみてみると、

[meta_key] => photo2 というのと、

[meta_key] => _ photo2 というのがあって、この空白入りのやつが怪しいと。

アンスコが先についているのが、Advanced Custom Fields 固有のデータで、それとアンスコなしの本来のカスタムフィールドのデータが連動していると。

ところが、アンスコを消すと、先頭に空白がつくので、それがなくなってしまって、整合性がとれなくなるということでした。

_ photo2から、photo2は取り出せるけれど、その逆はできない(photo2→_photo2)という感じでしょうか。

だから、管理画面では違う画像に入れ替えたらちゃんと変わるのに、フロント側では表示されないというわけですね。

なお、Advanced Custom Fields のフィールド名を後から変更すると、変更前に保存された古いフィールド名のデータはそのまま残骸として残ってしまうようです。

実際には動作上はあまり問題はなってませんが、きになるなら

$sql = "DELETE FROM wp_postmeta WHERE meta_key='_ photo2'";
$results = $wpdb->query( $sql );

という感じで一括削除出来ると思います。自己責任で。

そもそも、Advanced Custom Fields のフィールド名を入力する段階で気をつけておかないといけないことですね。

 

WordPressのメディアをカテゴリー分けするプラグイン

WordPressのメディアに入れた、画像などのデータをカテゴリー分けして、検索できるようにするプラグイン。

WordPressは、デフォルトではメディアにたまった画像などは累々と貯まるようになっていて、メディアの一覧から目的の画像を探し出すのは意外と面倒です。

たとえば、フォトコンテストなんかで募集した写真を掲載するときに、記事中に使っている画像とごっちゃになると、あとから確認する際なんかに探し出すのが大変なので、カテゴリ分けしておきたいな。という場合には、さくっとプラグインで対応できます。

メディアをカテゴリ分けするプラグインにも、いくつかあるので、まとめ。

Media Library Categories

紹介する3つの中ではダントツでシンプルなプラグイン。とりあえず、カテゴリー分けできたらなんでもいい。という場合はこれかな。

投稿で使うカテゴリーとおなじタクソノミー、つまりWordPress標準のカテゴリーで分類します。

特に設定はなく、プラグインをインストールしたら、メディアに「カテゴリ」の項目が出てきて、一覧から絞込もできます。カテゴリーの設定は、メディアの編集画面で設定します。

Media Library Categories の絞込操作

Enhanced Media Library

投稿でつかうカテゴリーと、Media Categoriesというカスタムタクソノミーが追加されます。

Enhanced Media Library の検索操作

プラグインをインストールした時点では、絞込ができるのはMedia Categories の方だけです。

じゃ、なんのためのカテゴリー?とも思いますが、設定→メディア→Media Taxonomies→Non-Media Taxonomiesで、Filter for List View、Filter for Grid View / Media Popupにチェックをつけると、カテゴリーでも、絞込、検索ができるようになります。

Enhanced Media Library でのカテゴリーの検索設定

あと、項目を日本語表示にしたければ、設定→メディア→Media Taxonomies→Media Taxonomies で日本語表記の設定をしてあげればOKです。

Enhanced Media Libraryで項目の日本語設定

 

また、[+ Add New Taxonomy]で、独自にカスタムタクソノミーを追加することもできます。

それから、設定→メディア→Media Taxonomies→Media Library→Media Shortcodeで、Enhanced media shortcodes にチェックをつけると、ギャラリーを出力できるようになりますが、Warningで「他のプラグインとかと一緒に使うときは気をつけてね。問題があったら、作者に連絡してね!」なんて言ってるので、おまけ程度に考えておいたほうが良さそうです。

Enhanced Media Library でショートコードが使えるようにする

Media Library Assistant

カテゴリーと、タグがつけられるようになります。

Media Library Assistan の検索操作 Media Library Assistantでは、カテゴリも、タグも、カスタムタクソノミーになっているので、投稿でつかっているカテゴリとタグとは別ものになってます。なので、このプラグインをインストールした時点では、カテゴリーもタグもありません。

検索は、カテゴリやタグで絞込、検索ができるほか、タイトルやキャプションから文字列での検索もできるようになっています。

また、独自の管理機能がついていて、それを使えばクイック編集も出来るようになります。かなり多機能なのですが、英語表記なので、エンドユーザーに使ってもらうにはちょっと難がありますね。

Media Library Assistan の独自管理画面

他にも、設定項目が大量にあって、ショートコードでギャラリーを出力したり、カスタムフィールドを追加したりとできるようです。(あまり詳しく見ていないので、なんとなく)

テンプレート中にコードで出力する場合

WP_Queryでカテゴリ分けした一覧を取得するには、次のようにします。

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$terms = get_terms( 'tenant-category', '' );
$the_query = new WP_Query( 
	array(
		'post_status' => 'any',
		'post_type' => 'attachment' ,
		'post_mime_type' => 'image' ,
		'posts_per_page' => 12 ,
		'nopaging' => false, 
		'paged' => $paged,
		'tax_query' => array(
			array(
				'taxonomy' => 'category',
				'field'	   => 'slug',
				'terms'	   => 'contest',
			)
			)	
		)
	);

if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post(); 
	
	the_attachment_link( $the_query->post->ID ); //メディアをリンク付きで出力する

endwhile;
else: 
endif;
wp_reset_query();

メディアの出力方法については、こちら「WordPressでメディアのURLを取得するも参照してください。

 

 

WordPress管理画面の一覧でカラムを表示させたい

管理画面で、投稿や固定ページ、カスタム投稿の一覧には、タイトルや投稿者などの項目が並んでいますが、そこにカスタムフィールドを表示させたい場合があります。

今回、ちょっと手こずったところもあったので、それも合せてまとめ。

管理画面の一覧でカラムを表示

まず、管理画面の一覧でカラムを表示させたい場合、
固定ページでは、manage_pages_columns
投稿では、manage_posts_columns
カスタム投稿では、manage_posts_columns、または、manage_${post_type}_posts_columns
を使います。

以下、itemsというカスタム投稿と、item_idというカスタムフィールドがすでにあるとして、それを表示させたい場合。function.phpに以下を追加します。

固定ページでは、

function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	return $columns;
}
add_filter( 'manage_pages_columns', 'add_column_name' );

投稿では、

function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

とします。

$columns['item_id'] のitem_id はカスタムフィールド名と一致していなくてもも構いません。また、カスタム投稿は、投稿の一種なので、manage_posts_columnsを使えば、同じように表示されます。

なので、カスタム投稿では表示させたいくない場合、get_post_type を使って、投稿の場合だけに限定する必要があります。

function add_column_name ( $columns ) {
	global $post;
	if (get_post_type( $post ) == 'post'){
		$columns['item_id'] = "アイテムID";
	}
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

カスタム投稿だけに限定したければ、同じように、

function add_column_name ( $columns ) {
	global $post;
	if (get_post_type( $post ) == 'itenms'){
		$columns['item_id'] = "アイテムID";
	}
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

とすればOKです。
または、manage_${post_type}_posts_columns を使って、以下のようにしてもおなじです。

function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	return $columns;
}
add_filter( 'manage_items_columns', 'add_column_name' );

さらに、カスタム投稿では、日付を表示する必要が無いという場合。次のようにunsetで削除できます。

次の例は、カスタム投稿が items のときには、dateを削除、ついでに投稿でコメントを非表示にしたいとき。

function add_column_name ( $columns ) {
	global $post;
	if (get_post_type( $post ) == 'items'){
		$columns['item_id'] = "アイテムID";
		unset($columns['date']);
	}
	unset($columns['tags']);
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

ここまでで、一覧に項目が表示されるようになるはずです。

カスタムフィールドの値を一覧に表示させる

続いて、カスタムフィールドの値を表示させるようにします。

投稿、カスタム投稿では、manage_posts_custom_column を使います。
固定ページでは、manage_pages_custom_column を使います。

次の例では、固定ページ、投稿、カスタム投稿すべてに対応します。

//item_idの項目に値を表示
function add_column_value ($column_name, $post_ID) {
	if( $column_name == 'item_id' ) {
		echo get_post_meta($post_ID, 'item_id', true);
		//echo get_post_meta($post_ID, 'wpcf-item_id', true);//カスタムフィールドの作成に、プラグインの「Types」をつかている場合は、wpcf-をつける
	}
}
add_filter( 'manage_pages_custom_column', 'add_column_value', 10, 2 );
add_filter( 'manage_posts_custom_column', 'add_column_value', 10, 2 );

通常、投稿は投稿の日付順、固定ページとカスタム投稿はタイトル順 で並べられて表示されます。
そうではなくて、カスタムフィールドの値順で並べたい場合もあります。そんなときは、pre_get_posts で、is_admin で分岐させて並べ替えます。

表示された一覧を、item_id の順番で表示させたい場合、

//カスタム投稿itemsの一覧を、カスタムフィールドitem_idの値順に並べ替え
function set_post_types_admin_order( $wp_query ) {
	if (is_admin()) {
		$post_type = $wp_query->query['post_type'];
		if ( $post_type == 'items' ) {
			$wp_query->set('meta_key', 'item_id');
			$wp_query->set('orderby', 'meta_value');
			$wp_query->set('order', 'ASC');
		}
	}
}
add_filter( 'pre_get_posts', 'set_post_types_admin_order' );

[まとめ]管理画面で、カスタム投稿の一覧にカスタムフィールドの値を表示させて、その値順に並べ替える

以上、まとめますと、こんな感じになります。

//カスタム投稿にカスタムフィールドの項目を追加
function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	unset($columns['date']);
	return $columns;
}
add_filter( 'manage_items_columns', 'add_column_name' );

//カスタムフィールドitem_idの項目に値を表示
function add_column_value ($column_name, $post_ID) {
	if( $column_name == 'item_id' ) {
		echo get_post_meta($post_ID, 'item_id', true);
	}
}
add_filter( 'manage_posts_custom_column', 'add_column_value', 10, 2 );

//カスタム投稿itemsの一覧を、カスタムフィールドitem_idの値順に並べ替え
function set_post_types_admin_order( $wp_query ) {
  if (is_admin()) {
	$post_type = $wp_query->query['post_type'];
	if ( $post_type == 'items' ) {
	  $wp_query->set('meta_key', 'item_id');
	  $wp_query->set('orderby', 'meta_value');
	  $wp_query->set('order', 'ASC');
	}
  }
}
add_filter( 'pre_get_posts', 'set_post_types_admin_order' );

[トラブル解決]カスタム投稿一覧で、値が表示されない

カスタム投稿一覧に、項目の追加はできたけれど、なぜか値が表示されない、というトラブルに悩まされました。

カスタム投稿やカスタムフィールドを管理するのに、Typesを使っていたのですが、他のプラグインを全部無効にしてみたり、別のカスタム投稿で試したりと苦闘の末、Types自身の、カスタム投稿の設定で、「階層」にチェックをつけていたことが原因のようでした。

Typesのカスタム投稿設定で「階層」にチェックがついていた

これは、カスタム投稿の hierarchical に該当する設定で、投稿そのものに親子関係をもたせられるようにする、というやつです。
仮にTypesを使わずにカスタム投稿をつくって試すと、hierarchical をtrueにしても問題ないので、Types固有の現象かもしれません。

いずれにしても、今回の事案では意味もなくチェックをつけてしまっていたようで、いらなのでチェックを外すと、すんなりと解決しました。

同じように、Types使ってて、カスタム投稿一覧にカスタムフィールドが表示されずに困ったら、設定を疑ってみてください。

それにしても、たったこれだけに、半日を費やしてしまいました。。。
TypesやAdvance Coutom Fields を使うと、カスタム投稿やカスタムフィールドの管理が楽な反面、トラブル発生時に手こずるというアルアルですね。

 

DataTableの重複する行を取得する

DataTableに属するDataRowの任意の列から、重複する行を除去する方法はあるのですが、

            DataTable dt = new DataTable();
            DataColumn dc = new DataColumn("id", typeof(ulong));
            dt.Columns.Add(dc);
            dc = new DataColumn("name", typeof(string));
            dt.Columns.Add(dc);

            NewMethod(dt, 10000, "nakata");
            NewMethod(dt, 10001, "honda");
            NewMethod(dt, 10002, "kagawa");
            NewMethod(dt, 10002, "nagatomo");
            NewMethod(dt, 10003, "okazaki");

            DataView dv = new DataView(dt);
            DataTable dt2 = dv.ToTable(true, "id");//trueでDistinct(重複を取り除く)

削除ではなく、同じ値のものを取得いたくて、その方法を調べたのですが、

たとえば、DataTable.Margeを使ってRowStatusで取得する方法
https://social.msdn.microsoft.com/Forums/ja-JP/3e46f64d-fed3-4370-a16a-0987c8710050/datatable-linq?forum=vbgeneralja

とか、なるほど!というのもあったのですが、これはprimary keyが設定してあるDataTable同志でなければいけないので、そうでない場合はどうすればいいか。というわけですが、DataTable.Selectで取り出してチェックするしかなさそう。

たとえば、こんな感じで。

            DataTable dt = new DataTable();
            DataColumn dc = new DataColumn("id", typeof(ulong));
            dt.Columns.Add(dc);
            dc = new DataColumn("name", typeof(string));
            dt.Columns.Add(dc);

            NewMethod(dt, 10000, "nakata");
            NewMethod(dt, 10001, "honda");
            NewMethod(dt, 10002, "kagawa");
            NewMethod(dt, 10002, "nagatomo");
            NewMethod(dt, 10003, "okazaki");

            DataView dv = new DataView(dt);
            DataTable dt_distinct = dv.ToTable(true, "id");//重複除去


            StringBuilder sb = new StringBuilder();
            foreach (DataRow _dr in dt_distinct.Rows)
            {
                string id = _dr["id"].ToString();
                if (id != "")
                {
                    if ((int)dt.Compute("COUNT(id)", "id=" + id) > 1)
                    {
                        sb.Append(((sb.Length > 0) ? " OR " : "") + "id=" + id);
                    }
                }
            }
            DataRow[] dr_array = dt.Select(sb.ToString());
            DataTable dt_overlap = dr_array.CopyToDataTable();

なんか、気持ち悪いですが、Selectで重複しているIDだけを取り出すという、ベタなやり方。

こんなときは、LINQでいきます。

            DataTable dt = new DataTable();
            DataColumn dc = new DataColumn("id", typeof(ulong));
            dt.Columns.Add(dc);
            dc = new DataColumn("name", typeof(string));
            dt.Columns.Add(dc);

            NewMethod(dt, 10000, "nakata");
            NewMethod(dt, 10001, "honda");
            NewMethod(dt, 10002, "kagawa");
            NewMethod(dt, 10002, "nagatomo");
            NewMethod(dt, 10003, "okazaki");

            var dr_array = from row in dt.AsEnumerable()
                            where (
                                from _row in dt.AsEnumerable() 
                                where (ulong)row["id"] == (ulong)_row["id"] 
                                select _row["id"]
                                ).Count() > 1 //重複していたら、2つ以上見つかる
                            select row;
            DataTable dt_overlap = dr_array.CopyToDataTable();

もっと、すっきりできそうだけど、こんな感じで。

全角/半角を押しても日本語入力できない

Dellのデスクトップパソコンで、英語版のWindows7をインストール後に、日本語の言語パックを入れて対応しているものの、キーボードが対応できていない、という事例があって、対応を依頼されました。

本来なら、
http://freesoft.tvbok.com/win10/tips/keyboard.html
http://www.sakyou.com/ManualShop/Windows/06_keyboard/02_106keyboard/17_Win7PRO/index.html
こちらを参考にすれば、解決する話。だったはずなのですが、Windwosの言語設定を修正したり、デバイスドライバーを再インストールしたり、レジストリを修正したりしても、一向に解決しませんでした。

で、ふとキーボードをつないでいるUSB端子の、さす場所を変えてみると、デバイスドライバをインストールし始めたのですが、ヒューマンインターフェイスデバイスのところにKB216...という感じのドライバが追加されていました。

ちなみに、DellのキーボードはKB216とシールに印字されていたので、そういうことなのかもしれません。

キーボードは、「標準 PS/2 101/102 キーボード」は追加されることなく、「HID標準キーボード」があるだけでも、全角/半角キーで切り替えができるようになりました。

結局、背面のもともとさしていたUSBコネクタとは違うところに差し込むことで、無事解決しました。

  1. windowsの言語設定を日本語キーボードにして、英語は削除
  2. レジストリを修正(KORを削除)
  3. USBコネクタの場所変える→デバイスドライバがインストールされる

で解決しました。

SSLで一部のひとから「警告が表示されるんですけど」

SSLのインストールがうまくいったと思ったら、一部の人で警告が表示されると。

ほとんどの人は問題ないのに、なぜ?

サイト側では、すべてのリンクをhttpsに変えてるし、原因はなんぞ?

ここでチェックしてもらうと、warningっていわれるし。
https://cryptoreport.geotrust.com/checker/views/certCheck.jsp

気になるのは、警告が表示される端末と、されない端末があるという。

これはいったいなんだ?と、いろいろ調べてると、ここに書いてありました。

http://www.ict-solutions.jp/rapidsslca.html

なるほど。中間証明書のインストールができてないと。

おはずかしー。

サクラインターネットでの、中間証明書のインストール方法はここに書いてあります。

https://help.sakura.ad.jp/hc/ja/articles/206054842--%E7%8B%AC%E8%87%AASSL-%E5%88%A9%E7%94%A8%E4%B8%AD%E3%81%AESSL%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86