フォーラムへの返信

15件の返信を表示中 - 1 - 15件目 (全53件中)
  • 何度かテストしましたがエンターキーを無効にするアクションフックがなくても動作しました・・・。すいません。

    補足になりますが、上記の修正はタグの挿入が行われるタイミングをずらしただけです。

    tagBox.flushTags( $(this).closest(‘.tagsdiv’) );
    でタグのテキストボックスに文字が入力されたときの挙動を制御しているようです。
    すでに登録されているタグの候補をだしたりします。
    ※この修正を行うまでその機能に気づいてませんでした。候補を出す前にかってに挿入されてたので・・・。

    e.preventDefault();はなにもするなというおまじない。

    もともと
    「エンターキーが上がったらタグ挿入の処理をせよ、エンターキーが押されたときはなにもしないで処理をとめろ」
    という命令でした。

    これを修正すると
    「エンターキーが上がったら何もするな、エンターキーが押されたときタグの挿入をせよ」
    となります。

    キーが押されたときに、内部では「キーが下がった(keydown)」「キーが上がった(keyup)」と別れて判断され
    その両方を合わせて「キーが押された(keypress)」と判断しているようです。

    たいていはキーが下がってキーが上がる・・・キーが押されるのが普通なのですが、
    IMEで文字入力中(変換途中)はキーが押された、とブラウザが判断できず、最後にエンターを押して話した瞬間に「今エンターキーが上がった!」と判断するようです。

    説明ベタで申し訳ないですが、そういったIME使用中の挙動を利用してタグ挿入の発生タイミングをずらしたんですね。
    この修正を行うことでタグ候補だ出るタイミングが少しおかしくなりますが、修正前はその機能が使えなかったのでまあいいかなと思います。

    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つのブラウザでテストしてみると動いたんですがいかがでしょうか?

    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”の部分がそれにあたります。

    蛇足ですが、わたしは逆にタグの挿入を切りたくてこれを調べていました・・・。

    rincanさん

    エンターキーでの公開はできないにしても
    タグはエンターキーで挿入できる

    自分の環境でテスト(XP IE8/Firefox/chrome/opera)でざっくりテストしたときに
    タグの挿入の部分の挙動は従来と変わらなかったのですが、
    参考までにrincanさんの環境について教えていただけませんか?

    一部分だけエンターキーの無効を設定しないということは多分大丈夫だとおもいますが
    テストできないので自信ないです・・・。

    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を参考にさせていただきました。

    デフォルトテーマでも同じ状況ということと、書き込んでくださった内容を踏まえますと
    wordpress的にもCSS的にもいたって正常な挙動ですね。
    operaが・・・とおしゃってますが、多分position:fixedが機能するブラウザであればIEだろうがChromeだろうが同じように潜り込むと思いますよ。

    ログインしていない状態(管理バーが表示されていない状態)では問題ないのであまりきにしていなかったのですが、言われてみればページの一番上以外は確かに管理バーで隠れますね。

    これをどうしても回避したいのであればいくつかの方法が考えられます。

    1:管理バーをページの上部に完全に固定する。
    style.cssにでも

    #wpadminbar{
    position:absolute;
    }

    と記載すれば、管理バーはついてこなくなるので下に潜ることはなくなります。
    利用するのにページ上部にいちいち戻らなければならないですけどね。

    2:管理バー以外の部分をdivで囲ってスクロールできるようにする
    スタイルシートで本文全体にスクロールバーをつけることでフレームっぽくする方法です。

    <body>の直後からwp_footer()の直前までをdivで囲います。
    <div id=”body”>とでもしてください
    そしてスタイルシートには

    #body{
    	margin: 0;
    	position: fixed;
    	overflow: auto;
    	bottom: 0;
    	padding: 0;
    	top: 28px;
    }

    こんなかんじで設定してください。細部ちょっと調節しないといけないかもですが。
    ログインしていない場合は意味がないので、ログイン状態によってdivタグの表示を振り分けたほうがいい気がします。

    ほか、管理バーを下に設置するという方法もありそうですが、結構いじるの大変そうなので興味があれば調べてみてください。
    (単純に下に移動するだけでしたらスタイルシートですぐですが、プルダウンメニューが表示できなかったりしたので・・・)

    デフォルトのテーマで問題がないということですので
    自作テーマに影響を与えてる部分があると思うのですが
    実際にそのテーマを見ていないので原因の特定は難しいです。
    対策は難しくないと思いますが原因が特定できないので対策できない状態ですね。

    全部でなくても、サイトのhead内やbodyの最初のほうなど症状に関係有りそうな部分のソースを提示してくれたほうが
    ここがおかしいとか、おかしいところは見当たらないと的確に指摘できますし、
    解決策が分かる人が現れやすくなると思いますよ。

    なので現在でている情報だけの憶測で原因を推測できるのが
    先に書いたhtmlタグへのスタイル指定のほかに、
    自作のテーマをご使用とのことなのでCSSの挙動についてはご存知だとおもうのでさっきはかきませんでしたがサイトのデザインでtop:0;left:0;position:fixedで固定している部分がありそうとか、
    wp_head()の記述位置がおかしい、例えばheadタグの外に記述してるとかなど
    ぼんやりとした部分までですね。

    フォーラム: 使い方全般
    返信が含まれるトピック: タグクラウドのデザインが効かない

    インライン要素には縦方向のpaddingやmarginは効きません。
    display:inline-blockを指定するとpadding・marginが使えますが文字が折り返されなくなるのでline-heightで行の高さを設定するのが無難かなと思います。

    通常ですとwp_head()の部分に自動的に管理バー分の余白が!important付のcssで記述さてれいてます。
    ですがCSSのルールではimportantよりもクラスセレクタ・IDセレクタを使用した設定が優先されますので
    ご使用中のテーマのCSSでhtmlにidやclass名を設定してmarginやpaddingを指定されていないか確認してください。

    投稿画面での記事にはどうしても記載されてしまうようです。

    先にかいたコードは表示されないようにするためのコードですので挙動としてはそれでOKです。

    function post_mso_fix($postID) {
    	global $wpdb;
    	$content = $wpdb -> get_var("SELECT post_content FROM {$wpdb->posts} WHERE ID = '{$postID}' LIMIT 1");
    	if (preg_match("/\[endif\]/s", $content)) {
    		$content = preg_replace("/\sstyle=\".*?\"|<!--\[if\sgte\smso.*?endif\]-->|<p>\s<\/p>/s", "", $content);
    		$wpdb -> query("UPDATE {$wpdb->posts} SET post_content = '{$content}' WHERE ID = '{$postID}'");
    		return $postID;
    	} elseif (preg_match("/if\sgte\smso/s", $content)) {
    		$content = preg_replace("/\sstyle=\".*?\"|<!--\[if gte mso 9\]>-->.*?<!--\[if gte mso 9\]>-->|<!--\[if gte mso 10\]>-->|\/\*.*?;}/s", "", $content);
    		$wpdb -> query("UPDATE {$wpdb->posts} SET post_content = '{$content}' WHERE ID = '{$postID}'");
    		return $postID;
    	}
    
    }
    
    add_action('save_post', 'post_mso_fix');
    add_action('edit_post', 'post_mso_fix');
    add_action('publish_post', 'post_mso_fix');

    記事から不要箇所を削除するコードです。保存時に機能します。
    不要箇所が毎回同じパターンであるとは限らないので万能ではないです。
    ワードプレスのコードで対応するのはこのへんが限界かと思います。

    うーん。ダメでしたか。
    保存するタイミングより先に書き換えが起こってるみたいですね。

    function mso_fix_content($content) {
    	$content = preg_replace("/Normal.*;}/s", "", $content);
    	return $content;
    }
    add_filter('the_content', 'mso_fix_content');

    このコードは最初の質問ででていた変な文章の最初にある『Normal』という単語から最後にある『;}』という記号までを表示させないというコードになっています。
    記事にそのままNormal 0 0 なんとかかんとかと書かれてるのであればこれで表示されなくなるはずなんですよね・・・。

    記事を貼り付け→公開したら変な文章が表示されるのはわかったのですが、
    その公開した記事ををもう一度テキストエディタで開いたらどうなっていますか?
    上のほうの書き込みにあった「お試しで貼り付け」のときのような大量の文字が入ってるでしょうか?
    それとも公開したときに勝手についてくる変な文章だけでしょうか?

    サンプルのコードを貼りますが、このコードは記事の保存時に投稿内容を整形するので文字装飾が削除されたり、必要なタグまで消されてしまう可能性があるので気をつけてください。

    上のほうで書いてあったテキストエディタに切り替えた時に表示された謎の文字列から本文に関わる部分以外を削除します。

    function post_mso_fix($postID) {
    	global $wpdb;
    	$content = $wpdb -> get_var("SELECT post_content FROM {$wpdb->posts} WHERE ID = '{$postID}' LIMIT 1");
    	$content = preg_replace("/\sstyle=\".*?\"|<!--\[if\sgte.*?endif\]-->|<style>.*?<\/style>|<p>\s<\/p>/s", "", $content);
    	$wpdb -> query("UPDATE {$wpdb->posts} SET post_content = '{$content}' WHERE ID = '{$postID}'");
    	return $postID;
    }
    
    add_action('save_post', 'post_mso_fix');
    add_action('edit_post', 'post_mso_fix');
    add_action('publish_post', 'post_mso_fix');

    記事を保存した段階で整形されるので投稿したら謎の文字列がでるということはなくなると思うんですが・・・。

    このコードでやってることは<!–[if gte mso ●]>から<![endif]–>で囲まれた部分とspanタグなどについたstyle属性、不必要な空白文字を削除します。
    spanタグやpタグ、見出しなどは残るはずです。

    削除のタイミングは保存時なので貼り付けてすぐは謎の文字列はでてきます。

    なぜfirefoxでそうなるのかって部分は全然解決してないですけどね(´-ω-`)

    あ、すいません
    もう最初の質問の文字列は表示されていないんですね!
    その解決策を考えていました。

    今のところエディタには謎の文字列は表示されるものの、投稿したらサイトの記事そのものにはとくにおかしな様子はない、ということでよろしいでしょうか?

    根本的な解決策ではないですが、おそらくpinchさんがなってる状況と同じ事になっている人のサイトのソースを参考にして不要な文字列を削除する方法を考えました。

    フィルターフックで不要な文字列を除去 functions.phpに記述

    function mso_fix_content($content) {
    	$content = preg_replace("/<!--\[if gte mso.*.>-->.*.<!--\[if gte mso.*.>-->|\/\* Style Definitions \*\/.*;}/s", "", $content);
    	return $content;
    }
    add_filter('the_content', 'mso_fix_content');

    pinchさんのWordPressで表示されている実際のソースがわからないので適応できるかわかりません。
    似たような状況のサイトのソースを見ると

    <!--[if gte mso 9]>-->
    <!--[if gte mso 9]>-->

    というコメントで謎の文字列が囲まれていたので、その範囲を空白で置き換えています。
    また
    /* Style Definitions */
    から始まるスタイルっぽい部分も空白に置き換えました。
    記事の表示部分だけなのでエディタでは相変わらず謎の文字列は出現してるかと思いますが、いちど試してみてもらえませんか?

    フォーラム: 使い方全般
    返信が含まれるトピック: トップページのロゴマークの変更方法について

    アイコンファイルではなくPNGファイルのはずですが・・・

    http://ご自身のサイトのアドレス/wp-content/themes/pacific/images/header/site_id.png
    にアクセスして上書きした画像はみれますか?

    きちんと上書きされているようでしたらブラウザのキャッシュを削除してください。

    念のためご自身のサイトにアップしたテンプレートのロゴ部分でアドレスも確認してみてください。画像をサンプルの公式から引っ張ってきてたら別の方法でいかないとだめなので。たぶん大丈夫だと思うのですが・・・・

15件の返信を表示中 - 1 - 15件目 (全53件中)