ACFとqTranslateのコンフリクト回避のおぼえがき

日本語と英語のサイトを構築する時によく使うのがqTranslateというプラグイン。
一つの投稿に対してマルチランゲージでデータを作れるので便利なのですが、もう一つ便利に使っているのがAdvanced Custom Fields

クライアントが簡単にデータを更新できるように作ることが多いので、今回の案件ももちろん使おうとしていましたが、なぜか設定した項目が管理画面で表示されない。
もろもろ調べたところ、どうやらコンフリクトがあるらしく、コードを書き換えないと動かないと。。
ただ、そうなるとプラグインがアップデートされた時にまた上書きされてしまう可能性もあるので、悩んでいたタイミングでバッチリのパッチプラグインがでました。

http://wordpress.org/plugins/acf-qtranslate/developers/
その名も「ACF qTranslate」。
これを使ったらバッチリ動くようになりました。
多分、ACFか、qTranslateのどちらかがアップデートされたら解消されるとは思うけど、本当に助かりました・・。
現時点で最新版のWPと最新版のプラグインの環境で動きます。

Advanced Custom Fieldsでフィルター&ソートのおぼえがき。

毎度毎度このAdvanced Custom Fieldsプラグインにはお世話になってるのですが、久しぶりにハマったのでメモ。

クライアントのサイトで、西暦、日付、タイトルの一覧を作る必要があって、それを西暦ごとに別々に一覧を用意し、日付でソートしたかったんだけど、なんでか思ったとおりにソートされず、、数時間悩みました。

表示させるページはcategory.phpなので、データの中身自体はcontent.phpで、loopさせることになります。
一覧させるのでtableかdlで囲うので今回は気分でtableつかいました。
content.phpの中身はこんなかんじ。loopするので<table></table>の部分だけcategory.phpに書きます。

<tr>
	<th><?php $date = date_create(''.get_field('日付の変数名').'');
	 echo date_format($date,'Y/m/d'); ?></th>
	<td><a href="<?php the_field('link_url',$post_id); ?>" target="_blank">
	<?php the_title(); ?></a></td>
</tr>

ここは普通にACFの使い方でOKなのだけど、これだけだとズラズラっと全部がでちゃうので、年号ごとにブロックで表示できるようにしたかったわけです。

気分的にはまず年号でフィルタした後に並び替えをするものだと思ってたので、そう書いていましたが、見事に逆でした。考え方としては並び替えた後に年号でフィルタするようです。なんだか処理が重そうですが、そうみたいです。

無事に出力できたコードはこちら。

<?php
/* Start the Loop */
// args
$args = array(
	'meta_key'		=> '日付の変数',
	'order'			=> 'DESC',
	'showposts'		=> 30,
	'orderby'		=> 'meta_value_num',
	'meta_query'	=> array(
		'relation'	=> 'AND',
		array(
			'key'		=> '西暦の変数名',
			'value'		=> '2013'
		)
	)
 );
// query
$wp_query = new WP_Query( $args );
while ( have_posts() ) : the_post();
	get_template_part( 'content', 'cat' );
endwhile;
twentytwelve_content_nav( 'nav-below' );
?>

meta_keyで日付の変数を入れて、orderで並び替え、showpostsで30件を指定。
relationでANDの指定をして、追加の条件を入れます。試してないけど、”AND”じゃなくて、”OR”にすれば複数条件での指定もできるはず。

keyに西暦の変数名を入れたらvalueで取り出したい値(今回は2013年を取り出したかったので、ACFで西暦のフィールドに2013とはいっているもの。)を指定します。
その下はループのデータを引っ張る部分なので、特に変更なし。今回はcontent-cat.phpというファイルからデータを引っ張ってきているので、「get_template_part( ‘content’, ‘cat’ );」としてるだけ。

本当は、西暦も入れた状態で普通に一覧をすればこんなこと必要ないけど細かいデザインの問題で、今回はこの方法。

All in one Event Calendar でポスターボード表示にするとテキストが省略されないので修正のおぼえがき

http://time.ly
便利に使っているAll in one Event Calendar だけど、日本語環境で使うにはちょこちょこと修正が必要なので、、

まずは管理画面や表示をひと通り日本語化したいわけです。
日本語ファイルをゼロから作るのはかなり手間なので、ファイルを公開しているサイトからダウンロードして使います。
» All-in-One Event Calendar 日本語化
v1.9.2に対応しています。ありがたいです。

で、今回ハマったのがポスターボード表示の時にテキストが長ーーーーくなってしまう問題。日本語はスペースで単語を区切らないので、正しく省略してくれません。なので

“…..wp-content/plugins/all-in-one-event-calendar/app/model/class-ai1ec-event.php”
ここのファイルを編集。

$words = explode( ‘ ‘, $content );
if ( count( $words ) > 25 ) {
$this->post->post_excerpt = implode(
‘ ‘,
array_slice( $words, 0, 25 )
) . ‘ […]’;

こうなっている部分、25単語以降を省略するという設定なのか、日本語だと25文章となるので、25の部分を1とか2にしてしまいます。
これでポスター表示にしてもコンテンツ内の文章がぜ~んぶ出ないで済みます。

ここ2日悩んでいたのでよかった。。

よくよく探したらTime.lyのフォーラムに載っていました。

Change excerpt length?

無事解決★

2015.11.6追記
しばらくぶりにこの作業をしようとしたら大幅なバージョンアップにより、このファイルが無くなってました。
今はテーマファイル内のfunctions.phpで変更できました。

/* Changed excerpt length to 2 words*/
function my_excerpt_length($length) {
return 2;
}
add_filter(‘excerpt_length’, ‘my_excerpt_length’);

こんな感じで大幅に減らすとちゃんと省略されました。

不正ログイン

http://wordpress.org/plugins/crazy-bone/

ここのところ、wordpressへの不正ログインの情報を良く聞くのと、クライアントのサイトへの不正ログインがあったため、ここのサイトもちょっとセキュリティを強力にしてみました。
インストールしたプラグインはCrazy Boneというもの。
インストールすると管理画面の「ユーザー」のなかに「ログイン履歴」というメニューができます。
あとは放っておくだけw。

あ、もちろん、ログインIDをそのまま「admin」にしておくのはNGです!
デフォルトが「admin」なので、パスワード破られたら終わりなのでね。

で、しばらくしたら世界中いろんな場所から突っつかれてました。笑

shot 2013-08-07 7.05.14 PM

中国・ロシアはまだしも、、カザフスタン、ラトビア、、
しかもnetscape 3.0の環境からというのがおそろし。
多分IP偽装だとは思うけど、知らない間に自分のサイトがつっつかれてるもんだね。

all in one event calendarとAdvanced custom fieldsがぶつかっていた。

気が付かなかったけど、all in one event calendarとAdvanced custom fieldがコンフリクトしていた。。
この2つがめちゃめちゃ使いやすくて開発していたサイトで途中バージョンアップを繰り返しているうちに、気がついたらcustom fieldに入れた値が反映されなくなっていました。

投稿画面では問題なく保存されていたのと、普通のカスタムフィールドに直接値を入れると動いていたのでcalendarのプラグインとの相性が悪いのだろうと色々調べたら同じ問題の記事を発見。あー、たすかったお。

Conflict With All-In-One Events Calendar: Fields not saving

class-ai1ec-events-controller.php

ここの記述を変更したら無事に動いたとさ!

437 if ( get_magic_quotes_gpc() ) {
438 foreach ( $_POST as &$param ) {
439 $param = stripslashes( $param );
440 }
441 }

ここを下記にへんこう。

// Strip slashes if ridiculous PHP setting magic_quotes_gpc is enabled.
if ( get_magic_quotes_gpc() ) {
foreach ( $_POST as &$param ) {
if (!is_array($param)) {
$param = stripslashes( $param );
} else {
$param = stripslashes_deep( $param );
}
}
} - See more at: http://support.advancedcustomfields.com/discussion/4831/conflict-with-all-in-one-events-calendar-fields-not-saving/p1#sthash.pQamLH8j.dpuf

まぢで、ありがとうございます。

wordpressで画像のURL一括変更のおぼえがき。(ブログの引越しの時とかにね!)

初めてサイトとかブログを立ち上げるんだったら関係ないのだけど、もうすでにブログを立ち上げている場合、データ自体はブログ側で書出し➝wordpressでインポートが可能なのだけど、画像自体は持ってきてくれない。
で、手っ取り早い方法としては画像を一括でダウンロードし、引越し先の適当な場所にアップロード。
後はxmlの画像のパスを書き換えれば済むんだけど、wordpressのデータを更にエクスポート、インポートするのはちょっと怖い。

ということで、やっぱり便利なツールが。

http://urbangiraffe.com/plugins/search-regex/
 Search Regex

いわゆる、検索置換のプラグイン。
これで特定のURLを新しいURLに書き換えたり、細かい文字の修正をしたりが簡単にできます。
動きも軽くて、しかも1000件くらいのデータであればあっという間に終わっちゃいます。

かゆいところに手が届くー!のプラグイン。

ユーザがアップロードした画像のみを表示させるおぼえがき

仕事でどうしても必要だったので久しぶりに深堀り。
特定多数のユーザが記事を投稿するようなサイトを構築する場合、アップロードしたメディア、特に画像が他の人がアップロードしたものも見えてしまう。
もちろん、削除や変更はできないのだけど、ずらーっと画像が並んでしまうとミスにもつながるので、自分がアップロードした画像のみが見えるように変更したかった。
ただ、いくかの記事を参考にトライしてみたけど、うまくゆかず。

で、色々としらべたところ、解決している記事を発見!

Media library to list images only user uploaded

記事のとおり、不要なコードを除いたらうまくうごきました。

ま、めったに使うことはないのだけど、覚書として。

/* * メディアの抽出条件にログインユーザーの絞り込み条件を追加する*/
	add_action('pre_get_posts','users_own_attachments');

	function users_own_attachments( $wp_query_obj ) 
	{
		global $current_user, $pagenow;
		if( !is_a( $current_user, 'WP_User') )
		return;
		if( !current_user_can('delete_pages') )
		$wp_query_obj->set('author', $current_user->id );
	return;
	}

Advanced Custom Fieldsでカテゴリごとのヘッダ画像・テキストの追加おぼえがき

WordPressをいじってる中で、ちょこちょこ出てくるのが、カテゴリごとにヘッダのテキストや画像を追加したいという要望。
通常のヘッダはそのままで、カテゴリ毎にちょっとしたテキストを入れたい場合はテンプレートを複製して、category-1.phpとかカテゴリIDを付けて対応する場合もあるし、画像だけだったらcssで画像のidを取得して振分ける方法もあるのだけど、今回は複数のカテゴリがあって、更にテキストも入れたい。ループの下に更に別のテキストも入れたい。
そして、実際に運用するのがクライアントだということもあって、汎用性を考えてAdvanced Custom Fieldsで対応します。

http://www.advancedcustomfields.com/

Advanced Custom Fieldsは前にもちょこっと書いたけど、カスタムフィールドをセットごとに作ることができて、更にそれをどこに使うかの指定ができるスグレモノのプラグインで、ここしばらくはほとんどのクライアントで使用しています。
最近は日本語にも対応してま~便利。ここまでくれば有料になってもお金払っちゃいます。


で、更に今回はカテゴリごとに対応させたいので、こんなかんじに名前をつけて、セットを作成します。
で、「位置」→「ルール」でカスタムフィールドを表示させる場所を指定します。「分類(追加・編集)」「カテゴリー」を選択すればこのカスタムフィールドのセットが投稿のカテゴリの部分に表示されるようになります。
テキストはテキストエリアを選ぶとhtmlも使えるので便利。

次は実際にカテゴリで値を入力。
カテゴリーの編集画面を見ると、ちゃんと下にカスタムフィールドが表示されてます。
これができると、ちょっとカテゴリを追加した場合も簡単にテキストや画像がここで設定できるので、テンプレートをいちいちいじらなくてOK。

で、最後は各フィールドを実際にテンプレートで呼び出す準備。
category.phpか、archive.phpにを編集。
このプラグインで呼び出す場合は

<?php the_field('フィールド名'); ?>

で値を取得できるのだけど、ループ外で呼び出す場合は、カテゴリのIDを取得しないと表示されませんでした。
なので、

<?php
  $cat_id = get_queried_object()->cat_ID;
  $post_id = 'category_'.$cat_id; 
  ?>
  <?php the_field('フィールド名',$post_id); ?>

こんなかんじにすればバッチリと表示されました。

というか、この覚書はこの部分を取っておきたかっただけ、、

これで、不要なテンプレートを量産しなくてすみます。

2016.3.9 追記:
画像のパスなどをACFで指定している場合、画像がないときに「?」となってしまいます。
そんな場合は下記のようにその値が入っている場合のみ表示するようにすれば解決できます(^^)

<?php if( get_field('image') ): ?><img src="<?php the_field('image'); ?>"><?php endif; ?>

最近よく使うプラグイン

http://www.advancedcustomfields.com/

ここ最近よく使うWordpressのプラグインが、Advanced Custom Fields
今まで使ったcustom field gui系の中ではダントツに使いやすいので、ここのところはいろんなクライアントに利用。

使い方はいろんな人が解説しているので不要だと思うけど、初めてでもすぐに使えるはず。
いくつもセットを作って、投稿もしくはページ、カテゴリーなど、決めた部分にだけフィールドセットを表示できるのがかなりいい。
あと、チェックを入れれば、テンプレートに記述していても、値が入っていなかったら無視してくれる。

基本的には
・カスタムフィールドを作る
・フィールドタイプを決める
・postとpageのどちらかに使うか決める
・テンプレートにタグを記述

という流れだけ。
今までカスタムフィールドをいじっている人ならあっという間です。

個人的には画像をアップロードしてそれを表示する部分でちょっとてこずったので、基本のタグのおぼえがき。

<?php if( get_field('フィールド名')); ?><?php the_field('フィールド名'); ?><?php endif; ?>

さらにちょっと便利ツールとして、サイトの紹介なんかをするときに簡単にサムネイルを表示してくれるプラグイン。

http://www.binarymoon.co.uk/projects/bm-shots-automated-screenshots-website/

BM Shots
ショートコードを入れるだけで勝手にサムネイルを表示してくれます。
こんなかんじ。

[ browsershot url="http://link-to-website" width="foo-value"]

で、ショートコードを毎度毎度覚えておいたり、前の投稿を探すのも面倒なので、AddQuicktagっていうプラグインで予め登録しちゃいます。

ま~便利!

来年もね

もともと、静的なコーディングから初めて、MTが出たタイミングでCMSでの運用やお仕事がメインになってきてました。
このあたりの仕事にシフトできたのも、YNOTに居た時に学んだことが大きくて、単にウェブサイトのデザインをするだけじゃなくて、汎用的で効率がいい、メンテがしやすいものをどうやって設計したら良いか、ということを考えるように?考えなくてはいけないとだいぶ勉強しました。
何のためにつくるか?ということをしっかり考えてから作らないと、作り手の勝手な作品になるだけなんだよねー。

そして今はwordpressをメインに使っています。

きっと来年も使い倒すと思うけど、今後はスマートフォン向けの画面のカスタマイズを勉強しなくては・・・。きっとこれが来年のお仕事の目標になるはずー。