投稿画面でエンターキーを押して記事が公開されてしまうのを防ぎたい
-
WordPressと関係なくフォーム周りで以前からよく問題になってるみたいですね。
すこし調べますとJavaScriptで回避できるようです。アクションフックで管理画面のヘッダーにjavascriptのソースを挿入します。
functions.phpに書いてください。function no_enter(){ echo <<<JSCODE <script type="text/javascript"> function BlockEnter(evt){ evt = (evt) ? evt : event; var charCode=(evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode); if ( Number(charCode) == 13 || Number(charCode) == 3) { return false; } else { return true; } } window.onload = function(){ var elements = document.forms["post"].elements; for (var j=0; j < elements.length; j++) { var e = elements[j]; if (e.type == "text"){ e.onkeypress=BlockEnter; } } } </script> JSCODE; } add_action('admin_head', 'no_enter');
エンターキーの押下でフォームの送信を行わないようにする : blog.nomadscafe.jpを参考にさせていただきました。
paruchanさん
コードの提示ありがとうございます。貼り付けたところ、
実際に機能し、エンターキーで公開されなくなりました。ただ、大変助かるコードではあるのですが、
同時にタグの挿入もエンターキーで出来なくなってしまいました。わがままな注文なのですが、
エンターキーでの公開はできないにしても
タグはエンターキーで挿入できる
というようにはできませんでしょうか?rincanさん
エンターキーでの公開はできないにしても
タグはエンターキーで挿入できる自分の環境でテスト(XP IE8/Firefox/chrome/opera)でざっくりテストしたときに
タグの挿入の部分の挙動は従来と変わらなかったのですが、
参考までにrincanさんの環境について教えていただけませんか?一部分だけエンターキーの無効を設定しないということは多分大丈夫だとおもいますが
テストできないので自信ないです・・・。function no_enter(){ echo <<<JSCODE <script type="text/javascript"> function BlockEnter(evt){ evt = (evt) ? evt : event; var charCode=(evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode); if ( Number(charCode) == 13 || Number(charCode) == 3) { return false; } else { return true; } } window.onload = function(){ var elements = document.forms["post"].elements; for (var j=0; j < elements.length; j++) { var e = elements[j]; if (e.type == "text" && e.class != "newtag"){ e.onkeypress=BlockEnter; } } } </script> JSCODE; } add_action('admin_head', 'no_enter');
動作確認できてません。
class属性にnewtagが設定されていないテキストボックスのエンターキーを無効にするよう修正しました。
コードの下から9行目e.type == “text” && e.class != “newtag”の部分がそれにあたります。蛇足ですが、わたしは逆にタグの挿入を切りたくてこれを調べていました・・・。
paruchanさん
ご返信が遅くなってしまい、申し訳ありませんでした。
paruchanさんが提示してくださいましたスタンスで
環境を提示しますと、
windows7 IE10/chrome/firefox/operaという感じです
(それぞれ最新版を利用しています)少し話が長くなるかもしれないですが、お付き合いいただけると幸いです。
これはタグの問題で、他のトピックでも見受けられたものですが、
IEやfirefoxの場合、デフォルトのタグはひらがなを漢字などに変換して
エンターキーを押した段階で自動で挿入されてしまう、という現象が
見られると思いますが、
その点がどうしても納得できず、wordpress/wp-admin/includes/meta-boxes内にある
タグのメタボックスについてコアファイルを少しいじってみました。
以下がコードです。<div class="tagsdiv" id="<?php echo $tax_name; ?>"> <div class="jaxtag"> <input type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" value="" /> <textarea style="display:none;" name="<?php echo "tax_input[$tax_name]"; ?>" rows="1" cols="20" class="the-tags" id="tax-input-<?php echo $tax_name; ?>" ><?php echo str_replace( ',', $comma . ' ', get_terms_to_edit( $post->ID, $tax_name ) ); // textarea_escaped by esc_attr() ?></textarea></div> <?php if ( current_user_can($taxonomy->cap->assign_terms) ) : ?> <div class="ajaxtag hide-if-no-js"> <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" /> </div> <?php endif; ?> <div class="tagchecklist"></div> </div>
上のようなコードにすると、
タグの部分に単語などを挿入した後にエンターキーを押すと、
公開も同時にされる、という形になります。
逆に、上のようなコードにしないと、
IEやfirefoxなどはどうしても単語の入力が難しい
という問題があるので、エンターキーで公開することを覚悟して、
上記のようにしていました。
そのため、エンターキーで公開しない方法を教えていただきたいと思い、
トピックを作成しました。そこで、paruchanさんのコードを貼りつけたところ、エンターキーでの公開は
確かになくなったのですが、同時にタグの挿入も出来なくなってしまった
という感じです。また、先ほどのparuchanさんのコードを貼りつけたところ、
特に変化が見られなかった、という形です。私の書き方が悪くて、誤解を招いてしまったかもしれません。
本当に申し訳ありませんでした。
いろいろと考えていましたが、極端なことを言ってしまうと
IEとfirefoxのタグの挙動に対する不満なのかもしれません。また、個人的な追加の質問なのですが、
IE10について、F12でブラウザモードをIE8にしたところ、
タグの追加がコードなどに関係なく出来なくなってしまいました。
paruchanさんはIE8で確認されたということですが、
なにか特別なコードなど使用しているのでしょうか?rincanさんへ
なるほど、コアファイルいじってあったんですね。
記載の部分コピーしたら同じ挙動になりました。わたしは普段operaを使っているのでIEは殆ど使わず8にアップデートしたそのままです。
またコアファイル等もまったくいじっていないので、先にかいたエンターキーを無効にするコードくらいですね。
このことでいろいろいじってて、思った通りにならないときはだいたいブラウザキャッシュの影響うけてたっぽいので
そちらの線でも調べてみてください。rincanさんの目標がトピックのタイトルとすこし違うんですが、
よく目にする質問なので気になっていました。ノンプログラマーでとくにJavaScriptは本当に苦手なんですが、
関わってそうな部分を細かくみていった結果もしかしたら解決に近づけるかも?という部分に行き当たりました。タグの挿入部分はJavaScript・Jqueryで便利に作られています。
この部分に関わるプログラムはwp-admin/js/post.js(post.min.js)に記載されています。もっと詳しく言うと144行目・149行目でエンターキーを押したときにどういう処理をするかというのが書かれているんですね。
ここを少し修正したら、エンターでも送信しないように出来たのでいちど試してもらえませんか?
前提として、wordpress/wp-admin/includes/meta-boxes.phpは初期のまま、エンターキー無効のアクションフックはわたしが最初に投稿した方を使います。
この状態でタグの挿入が初期状態と変わらないことも確認して下さい。
※もし、meta-boxes.phpが初期のままでもタグ挿入が出来ない場合はちょっとお手上げかも・・・wordpressで実際使用しているのはpost.min.jsの方だと思いますが、
そちらは修正するのが大変なのでpost.jsをコピーしてpost.min.jsにして修正してください。修正箇所は146行目の
tagBox.flushTags( $(this).closest(‘.tagsdiv’) );
を
e.preventDefault();
に151行目の
e.preventDefault();
を
tagBox.flushTags( $(this).closest(‘.tagsdiv’) );
に入れ替える形ですね。
4つのブラウザでテストしてみると動いたんですがいかがでしょうか?何度かテストしましたがエンターキーを無効にするアクションフックがなくても動作しました・・・。すいません。
補足になりますが、上記の修正はタグの挿入が行われるタイミングをずらしただけです。
tagBox.flushTags( $(this).closest(‘.tagsdiv’) );
でタグのテキストボックスに文字が入力されたときの挙動を制御しているようです。
すでに登録されているタグの候補をだしたりします。
※この修正を行うまでその機能に気づいてませんでした。候補を出す前にかってに挿入されてたので・・・。e.preventDefault();はなにもするなというおまじない。
もともと
「エンターキーが上がったらタグ挿入の処理をせよ、エンターキーが押されたときはなにもしないで処理をとめろ」
という命令でした。これを修正すると
「エンターキーが上がったら何もするな、エンターキーが押されたときタグの挿入をせよ」
となります。キーが押されたときに、内部では「キーが下がった(keydown)」「キーが上がった(keyup)」と別れて判断され
その両方を合わせて「キーが押された(keypress)」と判断しているようです。たいていはキーが下がってキーが上がる・・・キーが押されるのが普通なのですが、
IMEで文字入力中(変換途中)はキーが押された、とブラウザが判断できず、最後にエンターを押して話した瞬間に「今エンターキーが上がった!」と判断するようです。説明ベタで申し訳ないですが、そういったIME使用中の挙動を利用してタグ挿入の発生タイミングをずらしたんですね。
この修正を行うことでタグ候補だ出るタイミングが少しおかしくなりますが、修正前はその機能が使えなかったのでまあいいかなと思います。paruchanさん
詳しいご回答ありがとうございます。
こちらのご返信が遅くなってしまい、
申し訳ありませんでした。tagBox.flushTags( $(this).closest(‘.tagsdiv’) );
と
e.preventDefault();
の入れ替えでIEとfirefoxの挙動が修正されていました。
また、chromeも問題なく動作しました。ありがとうございます。
また、
エンターキーを無効にするアクションフックがなくても動作しました・・・。
ということですが、
この点は、入れても入れなくても大丈夫みたいなので、
私の好みで入れさせてください。javascriptの制御などについてですが、
決してparuchanさんが説明ベタなどではなく、
大変勉強になりました。ただ、また確認済みではないですが、
どうもプラグインなどの影響によって、
タグの挿入あたりに若干のエラーといいましょうか
違った挙動が見られるかもしれないです。
具体的なプラグインなどはまだはっきりしていませんが、
わかり次第、またご報告できればと思います。こちらからの報告が中途半端で申し訳なかったです。
本来の目的とは少しずれるかもしれませんが、
目的は達成できました。
本当にありがとうございました。しかし、他のコードやプラグインによる万が一のバグなどについても
今後とも報告したいと考えております。
そういった意味で解決済みにせず、
このままこのトピックを保持させていただきたく思います。貴重なトピックになったがゆえの判断かつ
一方的で申し訳ないですが、
いかかでしょうか
よろしくお願い致します。
- トピック「投稿画面でエンターキーを押して記事が公開されてしまうのを防ぎたい」には新たに返信することはできません。