サポート » 使い方全般 » 投稿画面で書ける文字数を制限したい

  • 解決済 hagemaru

    (@hagemaru)


    ワードプレスで、ユーザー投稿型のサイトの構築を検討しています。

    新規ユーザーには、投稿者の権限にすることで、投稿をしてもらえるようにしたいと考えています。

    その時に、投稿画面を新規ユーザーに使ってもらおうと思っているのですが、
    正直、ユーザーがどれくらいの文字数を書くのか、という部分について検討がついていません。

    そこで、投稿画面で書ける文字数をこちら側で制限したいと考えています。

    何か方法はないでしょうか?
    よろしくお願いします。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • こんにちは。

    コメント欄で文字数を制限する方法はありました。
    http://devslog.com/article/20111129100558.html

    こんな感じで add_filter でフックすれば実現は可能でしょう。
    ただ、今回の疑問点は「ユーザーがどれくらいの文字数を書くのか、という部分について検討がついていません」という部分なので、運用ルールでカバーしたほうが良いんじゃないかな?とも思いました。

    というのも、タグの使用を可能にしていると、単純に文字数のカウントでは済まなくなるからです。しかも投稿型という事なら、色々な書き方をする方がいるわけですよね。
    それなりのルールは設けると思うので、その際に1000文字くらいまでに留めてください、などとしておくのも手です。

    どうしても制限をかけたいということでしたら、投稿時ではなく表示の際に表示文字数制限をかけておき、ルールとして「1000文字以上はカットされます。必ずプレビューでご確認ください」とするとか。

    ちなみに、WPの容量としてはサーバスペックに依存するので、ご質問の内容で判断する限り、あまり心配する必要もないのでは~と思いました。

    WordPress › フォーラム » ワードプレスでどれぐらいの量のエントリやページを扱う事が出来ますか
    http://ja.forums.wordpress.org/topic/1407?replies=3

    トピック投稿者 hagemaru

    (@hagemaru)

    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;
    }

    上記コードは、本文からタグを取り除いてから文字数をチェックしています。
    制限に引っかかって戻った際に入力した内容が消えてるのが難点ですが、とりあえずはこういう感じで出来るかと。

    トピック投稿者 hagemaru

    (@hagemaru)

    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 にフックするのって面白いですね。
    これなら確かにタグを省いた文字数だけをカウントしてカットすることはないので、一番実用的ではないかなと思いました。
    タイトルならタグは入らないのでそのまま行けますね。
    私も勉強になりました。ありがとうございます!

    トピック投稿者 hagemaru

    (@hagemaru)

    miklaboさん
    mekemoke

    ご回答ありがとうございます。

    上手に両方とも機能しました。
    改めて面白いと思いましたし、
    自分でより調べていきたいとも思いました。

    自分が求めていたものは出来ましたので、
    解決済みとさせていただきます。

    本当にありがとうございました。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「投稿画面で書ける文字数を制限したい」には新たに返信することはできません。