こんにちは。
コメント欄で文字数を制限する方法はありました。
http://devslog.com/article/20111129100558.html
こんな感じで add_filter でフックすれば実現は可能でしょう。
ただ、今回の疑問点は「ユーザーがどれくらいの文字数を書くのか、という部分について検討がついていません」という部分なので、運用ルールでカバーしたほうが良いんじゃないかな?とも思いました。
というのも、タグの使用を可能にしていると、単純に文字数のカウントでは済まなくなるからです。しかも投稿型という事なら、色々な書き方をする方がいるわけですよね。
それなりのルールは設けると思うので、その際に1000文字くらいまでに留めてください、などとしておくのも手です。
どうしても制限をかけたいということでしたら、投稿時ではなく表示の際に表示文字数制限をかけておき、ルールとして「1000文字以上はカットされます。必ずプレビューでご確認ください」とするとか。
ちなみに、WPの容量としてはサーバスペックに依存するので、ご質問の内容で判断する限り、あまり心配する必要もないのでは~と思いました。
WordPress › フォーラム » ワードプレスでどれぐらいの量のエントリやページを扱う事が出来ますか
http://ja.forums.wordpress.org/topic/1407?replies=3
mekemokeさん
ご返信が遅くなってしまいまして、申し訳ありません。
いろいろと考えましたが、
mekemokeさんがおっしゃってくださいましたように、
『どうしても制限をかけたいということでしたら、投稿時ではなく表示の際に表示文字数制限をかけておき、ルールとして「1000文字以上はカットされます。必ずプレビューでご確認ください」とするとか。』
というようにしようと思いました。
ただ、いろいろと調べていく中で、
行数または文字数を一定以上でカットする方法が分かりませんでした。
もし、分かるようでしたら、教えていただけますとありがたいです。
申し訳ありませんが、よろしくお願いします。
出力前の本文をいじるには the_content フィルタが使えます。
文字列を 1000 文字でカットするなら以下の様な感じでしょうか。
add_filter('the_content', 'cut_content');
function cut_content($content) {
if (mb_strlen($content) > 1000) {
$content = mb_substr($content, 0, 1000);
}
return $content;
}
しかしこれだと HTML のタグがあった場合も途中で切ってしまったりします。
対策としては正規表現使ってタグ毎に区切ってとかでしょうか…。
個人的には、表示する時ではなく投稿、編集時に文字数をチェックしたほうが良いと思います。content_save_pre フィルタが使えます。
add_filter('content_save_pre', 'check_content_length');
function check_content_length($content) {
$length = mb_strlen(strip_tags($content));
if ($length > 1000) {
wp_die('本文は 1000 文字以内でお願いします<br />現在の文字数 : '.$length, 'エラー');
}
return $content;
}
上記コードは、本文からタグを取り除いてから文字数をチェックしています。
制限に引っかかって戻った際に入力した内容が消えてるのが難点ですが、とりあえずはこういう感じで出来るかと。
miklaboさん
ご返信ありがとうございます。
miklaboさんのコードを両方とも試してみましたが、
両方とも実用性があり、非常に面白いコードでしたので、
どちらを利用させてもらうか、非常に迷ってしまいました。
少し検討した上で、どちらか使いたいと思います。
補足的な質問なのですが、
このコードは、投稿の内容だけでなく、
タイトルにも応用できるものなのでしょうか。
もし、よろしかったら教えていただきたいです。
タイトルにも文字制限ということでしょうか?
その場合、プログラムはほぼそのままで、フィルターを変更するだけで可能です。
画面出力前のタイトルをカット
add_filter('the_title', 'cut_title');
function cut_title($title) {
if (mb_strlen($title) > 50) {
$title = mb_substr($title, 0, 50);
}
return $title;
}
編集時にタイトルの文字数をチェック
add_filter('title_save_pre', 'check_title_length');
function check_title_length($title) {
$length = mb_strlen($title);
if ($length > 50) {
wp_die('タイトルは 50 文字以内でお願いします<br />現在の文字数 : '.$length, 'エラー');
}
return $title;
}
プラグイン API/フィルターフック一覧 – WordPress Codex 日本語版
本文やタイトル以外にも様々なフィルターが用意されていますので、見てみるとおもしろいかもしれません。
追記
先日回答した際の出力前の本文をカットするものは、HTML タグを途中で切ってしまって表示が崩れるなどの可能性がありますので改良が必須です。ご注意下さい。
content_save_pre にフックするのって面白いですね。
これなら確かにタグを省いた文字数だけをカウントしてカットすることはないので、一番実用的ではないかなと思いました。
タイトルならタグは入らないのでそのまま行けますね。
私も勉強になりました。ありがとうございます!
miklaboさん
mekemoke
ご回答ありがとうございます。
上手に両方とも機能しました。
改めて面白いと思いましたし、
自分でより調べていきたいとも思いました。
自分が求めていたものは出来ましたので、
解決済みとさせていただきます。
本当にありがとうございました。