だいぶ前に設定した、このブログのテーマは反映されているのですが、新しく作った別のサイトでWindows Live Writer でテーマが取得できません。
調べてみたら、同様の症状の人はいるものの、解決策は見つかりませんでした。単純に編集用の CSS を指定できるようにしてくれればいいのに、、
それでも、オンラインのエディタよりはずっと便利なので使いますが、、
参考
Windows Live Writer が早くも使えなくなった
自分用ナレッジベースとして、Wordpress でサイトを作ってみました。WEB に公開できるような完成度ではないような文章をためておければいいなと。
最初は、.htaccsess で Bsic認証をかけていたのですが、これでは Windows Live Writer で投稿できませんでした。そこで、Wordpress 側で認証できる仕組みを模索してみました。
今回使用したものは、プラグインではなく、/wp-blog-header.php のwp(); の直前に下記のコードを追記します。
if (is_user_logged_in()){
}
else {
auth_redirect();
};
コードの動作
is_user_logged_in() : ユーザーがログインしているかどうかを返す
→WordPress.org : Function Reference/is user logged in
auth_redirect() : ユーザーがログインしているかどうかを判別し、ログインしていなければログインページにリダイレクト。ログインに成功すれば、最初にアクセスを試みたページに再度リダイレクトする。
→WordPress.org : Function Reference/auth redirect
説明を見る限り、auth_redirect() のみでも閲覧制限をかけられそうですが、これだけでは正しいユーザー/パスワードを入力してもログインできなくなってしまいました。
この動作を見る限り、auth_redirect() はログインに成功した場合、遷移元のページにリダイレクトするので、ログインページ自体を遷移元と認識してしまって、ログイン成功→ログイン画面のループにはまっているのでしょうか?それともバグ?auth_redirect() を定義しているコードを読んでいないのでわかりません。。
いずれにせよ、ログインしているかどうかを、is_user_logged_in() で判別してから auth_redirect() を呼び出すことで期待通りの動作をさせることが可能になりました。
このブログは階層構造をもつカテゴリのみをナビゲーションにしています。しかしカテゴリは増えるばかりで逆にわかりにくくなってきました。そこで、親カテゴリを残して、子カテゴリを開閉式のアコーディオンにしてみました。
目標とした動作
・子カテゴリ (孫カテゴリ以下を含む) を非表示に
・親カテゴリのリンクを無効化→子カテゴリの開閉に使う
$(document).ready(function(){
$('li.widget_categories>ul>li>ul').css('display','none');
$('li.widget_categories>ul>li>a').click(function(e){e.preventDefault()}).attr('href','#');
$('li.widget_categories>ul>li>a').click(function() {
$(this).next().slideToggle('slow');
});
});
問題は、子カテゴリのページに移動したときにそのカテゴリが展開されたままだとよいのですが。ページ遷移を超えるので、セッションとかクッキーとか使えばできるのでしょうが、めんどいのでとりあえず開閉のみ。
※追記、デザインを変えてからこの機能は付けていません。また、子カテゴリ(孫カテゴリ以下を含む)を非表示にするのをJavascriptで行っていますが、Jacascriptが実行される前までは表示されていて、実行されたタイミングで非表示になるので、cssで最初から非表示にしていたほうが良い気がします。
ただし、SEOの視点から見ると、display: none の指定はスパム判定の一因になる可能性もあるのでむずかしいところです。サイドバーのリンク集を displya: none にしたところで、いきなりスパム判定になるということもないでしょうけど。
サイドバーのカレンダーや最新エントリ一覧などのウィジットのタイトルは、デフォルトでは h2 タグが使われています。SEO の面から考えれば、見出しとして認識させたい部分ではないので p など、任意のタグに変更したほうがいいような気がします。
ただし、ウィジットのタイトルはテーマで定義されているのではないようです。そこで、fuction.php に以下のコードを追加します。
if (function_exists('register_sidebar'))
register_sidebar(array(
'before_widget' => '<div class="widget">',
'after_widget' => '</div>',
'before_title' => '<p>',
'after_title' => '</p>',
));
ウィジットの前後のタグ、ウィジットのタイトルタグを上書きしています。
WordPress.日本語 : WordPress ウィジェット API
WordPress のカスタムフィールドを使って、title タグを設定するサンプルを作ってみました。header.php とかの title タグを以下のコードと置き換えます。
<title><?php
$title = get_post_meta($post->ID,title,TRUE);
if ($title == "") {wp_title('');}
else {echo $title;}
?> « <?php bloginfo('name'); ?></title>
カスタムフィールドで、meta タグの “keywords” , “description” を入力できると楽しいなと思ったのでやってみました。まず、Wordpress のダッシュボードのカスタムフィールドで、それぞれ、”keywords” と “description” の名前のカスタムフィールドを作成しておきます。それから、下のコードを header.php の普段 meta タグを書いている場所に貼り付けます。
<meta name="keywords" content="<?php echo get_post_meta($post->ID,keywords,TRUE); ?>"> <meta name="description" content="<?php echo get_post_meta($post->ID,description,TRUE); ?>">
これだけで、meta タグの中に “keywords” と “description” を埋め込むことができました。若干気になったのが、もしカスタムフィールドに入れ忘れたら、キーワードが入っていない meta タグができてしまう。meta タグ自体がないのと、空欄の meta タグがあるのはどっちがましなんだろうかと。。細かいことですが。
で、カスタムフィールドが空欄の場合、meta タグ自体を表示させないパターンも作ってみました。
<?php $keywords = get_post_meta($post->ID,keywords,TRUE);
if (isset($keywords)) {
echo "<meta name="keywords" content="$keywords">\n";
}
$description = get_post_meta($post->ID,description,TRUE);
if (isset($keywords)) {
echo "<meta name="description" content="$description">\n";
}
?>
追記。上記のコードでは、カスタムフィールドの keyword を空のままにした場合、キーワードが空欄の meta タグが出力されてしまい、失敗。で、if の条件を $keywords == “” にしてみると動きました。なんでだろ。こんな感じ↓
<?php
$keywords = get_post_meta($post->ID,keywords,TRUE);
if (!$keywords == "") {
echo "<meta name="keywords" content="$keywords">\n";
}
$description = get_post_meta($post->ID,description,TRUE);
if (!$keywords == "") {
echo "<meta name="keywords" content="$keywords">\n";
}
?>
同じようにすれば title タグとかもコントロールできそうですね。カスタムフィールドで入力したタイトル+サイト名、なんて使えそうな気がします。
カテゴリのページだけ記事のタイトルが並ぶようにしたい。かつ、タイトルの下にボタンをつけて、ページ遷移なしで本文を出したい!という思いがずっとあって、今回実際にやってみました。
大まかな手順
- category.php にボタンの画像を設置
- category.php の記事の本文を適当なクラスをつけた div で囲む
- header.php で jQuery を読み込ませる
- header.php にボタンをクリックすると記事が出てくるように javascript を書く
書いてみた javascript
カテゴリをクリックしたあとのページで動いてます。
$(document).ready(function(){
$(‘div.hoge).css(‘cursor’,'pointer’);
$(‘div.hoge).click(function() {
$(this).next().slideToggle(‘slow’);
});
});
クリックした要素の次の要素
“クリックした要素の次の要素” の指定のしかたがよくわからず、時間がかかった。
$(this + ‘div.hoge’)
みたいにすると、クリックした要素 (this) の次の div.hoge が指定できると思いきや、すべての div.hoge に効果が発動してしまう。検索すると next() を使うと実現できることが判明。
next([expr])
要素集合の各要素の「次」にあたる兄弟要素を、全て抽出する。
このnext関数はあくまで各要素のすぐ隣の要素のみを抽出し、次以降を選択するのではない。その場合はnextAllを用いること。
引数には条件式を指定し、結果セットから更に絞込みを行うことも可能。
