YomiSearchへの「YomiSend」スパム登録対策
YomiSearchを利用し、ほぼ運営放置しているサーチエンジンに機械的なスパム登録が相次ぐので、何とかできないかと思いApacheのログを洗ったところ、スパム登録と思われるUAに「YomiSend」とあったので調べてみた。
どうやらYomiSendっていうスパム登録ソフトとYomiSearchサイトのリストが売られているようです。
ttp://yomisend-list.com/
ソフト開発者の隠された良心か、「YomiSend」と分かりやすいキーワードを置いていってくれるので、htaccessで下記のように対策してあげましょう。
#YomiSend対策
SetEnvIf User-Agent "YomiSend" deny_ua
order allow,deny
allow from all
deny from env=deny_ua
もしかするとUA変えるくらいの機能はあるかも知れませんが、この手のツールを使う層の9割はUAの存在も知らないので、効果はバツグンでしょう。少なくとも自分のところはスパム登録がほぼ無くなりました。
屑リンクを増やしてもSEO的にはマイナスなのにねぇ… SEOの根本的な理解をしようとしないから、こんなツールを掴まされるんだろうけど。
Web屋の新常識、属性値に「tags」は使うべからず
「新常識」とかエラそうに書いて、ボクが今まで知らなかっただけかも知れませんが。
MTをCMSとして提供したクライアントから「記事確認画面で印刷をしようとしたらエラーが出る」と問合せがあったので調べてみたところ…
http://www.koikikukan.com/archives/2008/03/23-015555.php
どうにもIE6では、idにしろclassにしろnameにしろ属性値に「tags」が入っていると印刷時にエラーが出て、一切印刷ができないというバグがあるようです。
MTは「タグ」の管理に「tags」という名前をコアに使っているのでMT側の調整など現実的ではなく、結局のところIEの更新をお願いするほかありませんでした。
今回はそれで事無きを得ましたが、企業によってはシステムポリシーなどで安易にブラウザのアップデートを行えない(というかインストールできない)場所もあるので、なかなか恐ろしい話です。
MTの他にWPなど「タグ」の概念があるCMSではなんとなく使われていそうな属性値なので、気をつけた方が良いかも知れません。
まぁIE6が1分1秒早急にでも根絶されればいいんですけどね!!!!!
実際あと5〜6年くらいは考えないとダメかも知れませんが(^p^)
スマート検索ウィジェット
Wordpressデフォの検索ウィジェットがイマイチしょっぱいので自分用の検索ウィジェットを作ってみた。その名も「Smart Search(笑)」
デフォの検索フォームは他のウィジェットと外れたソースフォーマットのためそこを合わせ、検索フォームの初期値を設定できるくらいの機能ではありますが。
function.phpに追記することでウィジェット画面に追加されます。
便利なプラグイン「Search Everything」との連動も確認済みです。
<?php
// Smart Search Widget
register_sidebar_widget(__('Smart Search','search'), 'widget_search');
register_widget_control( 'Smart Search', 'search_control' );function widget_search($args){
$search_title = get_option('search_title');
$title = empty($search_title) ? __('検索' ,'search') : $search_title;
$search_default = get_option('search_default');
if(get_search_query()){
$txt_value = esc_attr(apply_filters('the_search_query', get_search_query()));
} else {
$txt_value = $search_default;
}extract($args);
echo $before_widget."\n";
echo $before_title . $title . $after_title."\n";
echo '<form role="search" method="get" id="searchform" action="' . get_option('home') . '/" >'."\n";
echo '<input type="text" name="s" id="s" value="'.$txt_value.'" onblur="if (this.value == \'\') this.value = \''.$search_default.'\';" onfocus="if (this.value == \''.$search_default.'\') this.value = \'\';" />'."\n";
echo '<input type="submit" id="searchsubmit" value="'. esc_attr__('Search') .'" />'."\n";
echo '</form>'."\n";
echo $after_widget."\n";
}
function search_control(){
$search_title = get_option('search_title');
if (isset($_POST['search_title'])) {
update_option('search_title', $_POST['search_title']);
}
$search_default = get_option('search_default');
if (isset($_POST['search_default'])) {
update_option('search_default', $_POST['search_default']);
}
?>
<p><label for="search_title"><?php _e('タイトル:','search') ?>
<input id="search_title" name="search_title" type="text" value="<?php echo $search_title; ?>" /></label></p><p><label for="search_default"><?php _e( '初期文字列:','search' ) ?>
<input id="search_default" name="search_default" type="text" value="<?php echo $search_default; ?>" /></label></p><input type="hidden" id="search-submit" name="search-submit" value="1" />
<?php
}
?>
プラグイン化できれば楽なんでしょーけどねー、そこまでにはまだ至らず。
意外やアッサリとプラグイン化できたので、利用してみたい人はご自由にどうぞ。すごい単純なのでプラグイン作りの参考にも…なるかなァ…
>Wordpressプラグイン「Smart Search」ダウンロード
ZipファイルのままWPへ読み込んで有効化してもらうだけで、Smart Search ウィジェットが追加されます。
お決まりの文句ですが、ご利用により発生した一切の不利益の責任を負いません。
この程度の機能を備えたプラグインは当然のようにあるんでしょうけど、探すにも英語の海を掻き分けなけりゃならないわけで…なら作っちまえの精神で。
7/8追記:自分用にちょっと機能向上させました。
イメージボタンの利用を可能にしました。
書き出すHTMLもちょっと整理をしました。
ダウンロードリンクは変わっていませんのでご自由に。
エントリー一覧ウィジェット
MTの<MTEntries>のように、「そのカテゴリーに属するエントリー」をサイドに簡単に表示したかったがためにウィジェットを自作しました。
テーマファイルのfunction.php末尾に下記コードを追加で「エントリー一覧」のウィジェットを追加します。
ウィジェット設定画面より一応いくつかの設定ができるよう作っています。
<?php
// エントリー一覧表示ウィジェット
register_sidebar_widget(__('エントリー一覧','entries'), 'widget_entries');
register_widget_control( 'エントリー一覧', 'sample_control' );function widget_entries($args){//出力側定義
$ets_category_dynamic = get_option('ets_category_dynamic');
if($ets_category_dynamic == "on"){
$cat = get_the_category();
$cat = $cat[0];
$ets_category = $cat->cat_ID;
} else {
$ets_category = get_option('ets_category');
}$ets_title = get_option('ets_title');
$title = empty($ets_title) ? __('エントリー一覧' ,'entries') : $ets_title;$ets_numberposts = get_option('ets_numberposts');
$ets_offset = 0;
$ets_orderby = get_option('ets_orderby');
$ets_order = get_option('ets_order');
$ets_include = '';
$ets_exclude = '';
$ets_meta_key = '';
$ets_meta_value = '';
$ets_post_type = 'post';
$ets_post_parent = '0';extract($args);
echo $before_widget."\n";
echo $before_title . $title . $after_title."\n";
echo '<ul>'."\n";$myposts = get_posts('numberposts='.$ets_numberposts.'&offset='.$ets_offset.'&category='.$ets_category.'&orderby='.$ets_orderby.'&order='.$ets_order.'&include='.$ets_include.'&exclude='.$ets_exclude.'&meta_key='.$ets_meta_key.'&meta_value='.$ets_meta_value.'&post_type='.$ets_post_type.'&post_parent='.$ets_post_parent);
foreach($myposts as $post) :
echo ' <li><a href="' . get_permalink($post->ID) . '">'.$post->post_title.'</a></li>'."\n";
endforeach;
echo '</ul>'."\n";
echo $after_widget."\n";
}
function sample_control(){//ダッシュボード側定義
$ets_numberposts = get_option('ets_numberposts');
if (isset($_POST['ets_numberposts'])) {
update_option('ets_numberposts', $_POST['ets_numberposts']);
}
$ets_title = get_option('ets_title');
if (isset($_POST['ets_title'])) {
update_option('ets_title', $_POST['ets_title']);
}
$ets_category = get_option('ets_category');
if (isset($_POST['ets_category'])) {
update_option('ets_category', $_POST['ets_category']);
}
$ets_category_dynamic = get_option('ets_category_dynamic');
if (isset($_POST['ets_category_dynamic'])) {
update_option('ets_category_dynamic', $_POST['ets_category_dynamic']);
}
$ets_orderby = get_option('ets_orderby');
if (isset($_POST['ets_orderby'])) {
update_option('ets_orderby', $_POST['ets_orderby']);
}
$ets_order = get_option('ets_order');
if (isset($_POST['ets_order'])) {
update_option('ets_order', $_POST['ets_order']);
}
?>
<p><label for="ets_title"><?php _e('タイトル:','entries') ?>
<input id="ets_title" name="ets_title" type="text" value="<?php echo $ets_title; ?>" /></label></p><p><label for="ets_numberposts"><?php _e( '表示記事数:','entries' ) ?>
<input id="ets_numberposts" name="ets_numberposts" type="text" size="3" value="<?php echo $ets_numberposts; ?>" /></label> <small>(0なら無限)</small></p><p><?php _e( '表示カテゴリ:','entries' ) ?>
<?php wp_dropdown_categories('selected='.$ets_category.'&name=ets_category&class=ets_category'); ?><br />
<?php _e( 'カテゴリ別動的表示:','entries' ); ?><label for="ets_category_dynamic_1"><input id="ets_category_dynamic_1" name="ets_category_dynamic" type="radio" value="on"<?php if($ets_category_dynamic == "on"){?> checked="checked"<?php } ?> />ON</label> <label for="ets_category_dynamic_2"><input id="ets_category_dynamic_2" name="ets_category_dynamic" type="radio" value="off"<?php if($ets_category_dynamic == "off"){?> checked="checked"<?php } ?> />OFF</label><br /><small>(ONは表示カテゴリ指定を無視します)</small></p><p><?php _e('ソート項目:','entries') ?>
<select name="ets_orderby">
<option value="post_title"<?php if($ets_orderby == "post_title"){ ?>selected="selected"<?php } ?>>記事タイトル</option>
<option value="post_date"<?php if($ets_orderby == "post_date"){ ?>selected="selected"<?php } ?>>投稿日</option>
<option value="post_modified"<?php if($ets_orderby == "post_modified"){ ?>selected="selected"<?php } ?>>更新日</option>
<option value="ID"<?php if($ets_orderby == "ID"){ ?>selected="selected"<?php } ?>>記事ID</option>
<option value="post_author"<?php if($ets_orderby == "post_author"){ ?>selected="selected"<?php } ?>>投稿者ID</option>
<option value="post_name"<?php if($ets_orderby == "post_name"){ ?>selected="selected"<?php } ?>>スラッグ</option>
</select>
</p><p><?php _e('ソート順:','entries') ?>
<label for="ets_order_asc"><input id="ets_order_asc" name="ets_order" type="radio" value="ASC"<?php if($ets_order == "ASC"){?> checked="checked"<?php } ?> />昇順</label> <label for="ets_order_desc"><input id="ets_order_desc" name="ets_order" type="radio" value="DESC"<?php if($ets_order == "DESC"){?> checked="checked"<?php } ?> />降順</label></p><input type="hidden" id="sample-submit" name="sample-submit" value="1" />
<?php
}
?>
PHPがまともにできる人間ではないのでスンごいバタくさいコードかも知れませんが、そんな自分も後々カスタマイズしやすいよう作っていますので、ウィジェットを自作してみたいって方は色々いじってみてください。
ビジュアルエディタのCSS調整
ビジュアルエディタの書体がデフォだとなぜかセリフ(明朝)なので、ついカッとなって修正した。
エディタ内のHTMLにスタイル適用
ついでにエディタと出力画面のスタイルを合わせたくなったので…
/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css
- 1行目に下記を追記。
※ルートパスで書いてもいいですが、設置環境に左右されない相対パスにしてます。
「@import "../../../../../../../css/mce.css";」
あとは好きなようにmce.cssを調整。
というわけで、いきなりWordpressに浮気し始めました。
昔試した時とダッシュボードのUIが丸変わりしていて、MTより圧倒的に使いやすくユーザフレンドリーで、なおかつ記事公開のワークフローなども標準装備していたりしたので、ちょいとWPに慣れてみようと思った次第でございます( ^ω^)
備忘録:Drupalインストール直後導入項目まとめ
個人的導入推奨モジュール
画像系
有効化推奨コアモジュール
- Profile
- Trigger
- Upload
モジュールの日本語化
翻訳ファイルが上記サイトに多数掲載されています。
また「(モジュール名) 日本語訳」などでググれば、日本語訳ファイルが存在するものならヒットすると思います。
初めてやるゲームはまず「コンフィグ・オプション」から開いて、徹底的に自分色に染めていく性格がよく出てると思います。ハイ。