ログイン等をしなくてもユーザーが投稿が出来るプラグインとして、User Submitted Posts(以下USP)があります。
色々使っていて触ってるのですが、不明点もありつつ、修正したりしてなんとか使っています。そのあたりをメモしていきたいと思います。
かゆいところに手が届くかは分かりませんが、このプラグインの使用ヒントになれば幸いです。
本記事は基本的にこのプラグインをインストール済みである程度使っていることが前提です。
入力必須項目アラートは修正可能
フォーム項目で、入力必須項目に何もないとエラーが出ます。このエラーメッセージを修正出来ます。
poエディタなどで出来るかと思ったらmin.jsを直接いじるので賢い修正ではないでしょう。ですが他の方法が分からないというところです。もし分かる方がいたら教えて欲しいです。
修正できるか知らなかったのですが、調べたところ参考になったのはこちらのRoot-013さんの以下の記事でした。ありがとうございます!
プラグインの解説ともなっているので初めての使う方は参考になるかもしれません。今回の必須項目修正は一番下にあります。
該当のmin.jsファイルを直接いじることになります。
記事にもある通り、プラグインのアップデートがあるとこのjsファイルも上書きされるはずで、再度修正が待っています。
英語のエラーでもいいのですが、ユーザー受けは悪いのでここは面倒でも治すしかないかなというところです。
画像アップロード時のファイル名変更
USPでやりたかったことで、ユーザーがアップロードするファイルが任意のファイル名をつけられるため、重なってしまうということがありました。不具合というよりも仕様でしょう。
例えば、「top.png」というファイル名はありがちな名前です。これが既にアップロードされている状態で、他のユーザーがアップロードすると上書きされてしまうという動きです。
WordPressで動きとしては、
- 管理画面でメディアファイルとしてアップロードをすると、既存ファイル名があれば別の「-2」みたいな枝番が付いたはず
- しかし、USPではそのまま上書きされてしまい、既存ファイルがあとからのファイルに変わってしまう!
という状況でした。
この回答というか対策として1つ正統?なやり方として、functions.phpに処理を書くというものです。処理自体は、フィルターフックを使ってファイルがアップロードされた時に処理を入れるということです。
ワープレ屋さんの以下の記事をそのまま使わせてもらいました。
ページ中くらいにある処理で動くことは確認できています。が、このUSPでユーザーが投稿したアップロード画像には適応が出来ませんでした。推測に過ぎませんが、USPでアップロードされた画像と上のフィルターフックは別なのでしょう。
つまり、管理画面で管理者等がアップロードするときはファイル名がきちんとランダムになりますが、USPプラグインではそれは起きなかったということです。
ファイル名が重なる事象はかなり起きやすいためこれも直接改造で対応
実際に頻度が相当稀ならいいのですが、ユーザー側は適当なファイル名でアップするわけですからそこは強引に変えていく必要があります。ユーザー側にお願いするのも格好悪い(実際にこのような処理はプログラムでやったほうが正確でしょう)ので、改造しました。
以下具体的に行った方法です。
- 修正ファイルはuser-submitted-posts.php
- 該当箇所は、860行目あたりの「usp_attach_images」関数内
- 884行あたりを修正する。if (isset($files[‘name’][$i]) && !empty($files[‘name’][$i])) {からのブロック
- $file_nameがファイル名の取得となるため、これらに付与する。
- タイムゾーンが日本時刻になってない場合は、date_default_timezone_set(‘Asia/Tokyo’);
- 設定している最大枚数、例えば3枚なら3枚全てに付与されることを確認する
という感じです。
注意事項は、アクションフィルター等を使ったりしたほうがいいわけで(プラグインアップデートでソースが上書きされるため)、そのやり方が分からないために強引にやっています。これは上のmin.jsいじるのと変わらないことですね、jsでなくphpいじってますが。
修正後のコードは以下のようになります。コメントアウトしてあるのが修正前のコードですね。
if (isset($files['name'][$i]) && !empty($files['name'][$i])) {
$append = ($file_count > 1) ? '-'. $i : '';
//2019024 modify アップロード画像に本日日付を付与し一意にする対応 start
date_default_timezone_set('Asia/Tokyo'); //タイムゾーンを日本に
$date_str = date('YmdHi'); //201901241624形式(yyyymmddhhii)
//日付+ファイル名にする
$file_name = $date_str . basename($files['name'][$i]);
// $file_name = basename($files['name'][$i]);
//2019024 modify アップロード画像に日付を付与し一意にする対応 end
$parts = pathinfo($file_name);
USPのファイル名を生成する直前で日付を付与して一意にしているという処理です。頻繁にアップロードがなければ分単位はやりすぎですが、まあ1時間単位だとさすがにかぶるかもということで保険的にやっています。
languagesフォルダにあるpoファイルをいじれば日本語表示は楽
翻訳ファイルとは日本語だけでなくWordpressは世界中で使われているので、言語セットがあるということです。
USPのlanguagesフォルダに他言語もありますが、日本語だけであれば、「usp-ja.po」「usp-ja.mo」ファイルが対象です。
poファイルが翻訳ファイルでテキストです。これをpoeditというツールで修正すると楽です(テキスト直修正はさすがに)。ツールを見ると分かりますが検索したり、項目説明なども分かりやすくなっています。poeditの使い方等は他を探してみてください。
このpoファイルをコンパイルしたものがmoファイルなので、moファイルがなければUSP上でうまく見えないはずです。free版でも十分使えます。
修正したらmoファイルにコンパイルしてlanguagesフォルダにアップロードすればオッケーです。
フォームのプレースホルダ表示の修正
USPのviewsフォルダにある「submission-form.php」は、フォームの入力項目の説明やプレースホルダとリンクしています。
調べていて気づいたのですが、上のphpファイルに別msgidを設定し、poファイルに追加すれば動きます。結果的にpoファイルもphpもいじっているのでなんだかなというところですが、直接直打ちよりもいいかもしれません。
esc_attr_e('Webサービス集めました', 'usp');
のようにやるか、
esc_attr_e('Post Title ph', 'usp');
のようにやるかという違いです。正しいのは後者でしょう。
ただこの場合はpoファイルをテキストで予め追加してpoeditでmoにコンパイルしてそれをアップしてという手間もかかります。
これも難点なのは、languagesの内容がアップデート変わったり、viewsの中身も変わる、フォルダ構成が変わることもあるので、まあ短期的な対応としかならない点に注意ください。
以上USPの改造などヒントになれば幸いです。