Favorites for WordPressでお気に入り一覧を新着順に表示する方法

Favorites」は、クッキーとAJAXを利用してお気に入り登録ができるWordpress用プラグインです。
wordpressへのユーザー登録を必要としないので、簡単にお気に入り機能を実装できます。

ただ、デフォルトで利用すると、表示順が記事の投稿順になってしまいます。
そこで、少しだけコードを追加することで、お気に入りした順番に表示するようにしてみます。

まずはお気に入りを出力するコード

$favorites = get_user_favorites();
if ($favorites) :
  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // If you want to include pagination
  $favorites_query = new WP_Query(array(
  'post_type' => 'post', // If you have multiple post types, pass an array
  'posts_per_page' => -1,
  'ignore_sticky_posts' => true,
  'post__in' => $favorites,
  if ($favorites_query->have_posts()) : 
    while ($favorites_query->have_posts()) : $favorites_query->the_post();
      echo $post->post_title;
    endwhile;
  else :
    echo 'お気に入りはありません';
  endif;
));

上記のコードに以下の2行目と9行目を追加します。

$favorites = get_user_favorites();
krsort($favorites);
if ($favorites) :
  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // If you want to include pagination
  $favorites_query = new WP_Query(array(
    'post_type' => 'post', // If you have multiple post types, pass an array
    'posts_per_page' => -1,
    'ignore_sticky_posts' => true,
    'post__in' => $favorites,
    'orderby' => 'post__in'
  ));
  if ($favorites_query->have_posts()) : 
    while ($favorites_query->have_posts()) : $favorites_query->the_post();
      echo $post->post_title;
    endwhile;
  else :
    echo 'お気に入りはありません';
  endif;
));

具体的に説明します。

まずは2行目のkrsort($favorites); の部分は、取得したお気に入りデータを並び替えています。
$favoritesは配列で、お気に入りした順番(昇順)でデータが格納されています。
そこで、それを降順(つまりお気に入りした日時の新しい順)に並び替えます。

その配列をWP_Query()に渡すわけですが、WP_Query()は実行後に記事を投稿日時の新しい順に勝手に並び替えてしまいます。
そこで9行目の‘orderby’ => ‘post__in’ を指定します。
この「post__in」の意味は、「その上の行で指定している$favorites配列の順番でデータを取得してくれ」というお願いです。

こうすることで、最新のお気に入りから順番に表示してくれるようになるはずです。

WordPressの管理バーで、不要な項目を削除する

覚書です。管理バー(画面上部に表示される黒帯部分)で、不要なものを片っ端から非表示にしていく方法です。
テーマのfunction.phpに記載します。

function mytheme_remove_item( $wp_admin_bar ) {
$wp_admin_bar->remove_node('updates'); // アップデート通知
$wp_admin_bar->remove_node('wp-logo'); // Wpロゴ
$wp_admin_bar->remove_node('comments'); // コメント
$wp_admin_bar->remove_node('site-name'); // サイトタイトル
$wp_admin_bar->remove_node('new-content'); // 新規投稿ボタン
$wp_admin_bar->remove_node('my-account'); // 右の部分全体を削除

//新規投稿ボタン内メニュー
$wp_admin_bar->remove_node('new-media'); // メディア
$wp_admin_bar->remove_node('new-link'); // リンク
$wp_admin_bar->remove_node('new-page'); // 個別ページ
$wp_admin_bar->remove_node('new-user'); // ユーザー

//管理バー右側のメニュー
$wp_admin_bar->remove_node('edit-profile'); // プロフィール編集
$wp_admin_bar->remove_node('user-info'); // ユーザー
$wp_admin_bar->remove_node('logout'); // ログアウトボタン
}
add_action( 'admin_bar_menu', 'mytheme_remove_item', 1000 );

 

【すばらしい!】寄稿者専用のダッシュボードを作成する

仕事で寄稿者専用のダッシュボードが必要になった。
管理用(adminやeditor向け)と何が違うかというと、

メニューは記事投稿、投稿一覧(もちろん自分の投稿のみ)、プロフィール編集のみ。

なので、できればダッシュボードそのものも使わせたくないが、
通常のページに投稿フォーム等を表示する能力が僕にはないもので、涙をのんでダッシュボードを利用する。

しかし、それでも必要ないメニューは消したいなと思ってネットをあさっていたら、下記のようなページを見つけた次第です。
もう、まさに自分が理想としていた内容だったので、早速利用させていただきました。

▽参考にしたページ
WordPress管理画面にオリジナルメニューを追加した時の手順メモ


(すいません。画像借りました。)

左メニューを丸ごと消して、必要なメニューのみ追加。
参考ページはリンクが4つだが、ソースやボタン素材を追加すればメニューも増える。

これで要件の1つは完了。

もう1つは操作後のリダイレクトページ。
これについては別記事に記録します。

プラグインを使わずに「the_content」内の画像をlightboxで表示にする方法

※この方法を利用する場合は、wordpressのテンプレートファイルをカスタマイズする必要があります。

まず、「lightbox2」をダウンロードします。

このままjsファイルを使用すると、lightboxの閉じるボタンやローディング画像がリンク切れになってしまいますので、あらかじめこれらの画像ファイルをwordpressのメディア等でアップロードしておきます。

その後、「js/lightbox.js」ファイル内の画像リンクを、http://~から始まるURLで指定します。

テンプレートのheader.phpで、必要なファイルを読み込みます。

<link href="<?php bloginfo('template_url'); ?>/css/lightbox.css" type="text/css" rel="stylesheet" media="screen" />
<script src="<?php bloginfo('template_url'); ?>/js/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="<?php bloginfo('template_url'); ?>/js/lightbox.js" type="text/javascript"></script>

 

function.phpに以下と追加します。

function lightbox_auto($content) {
 global $post;
 $pattern[0] = "/<a(.*?)href=('|")([A-Za-z0-9/_.~:-]*?)(.bmp|.gif|.jpg|.jpeg|.png)('|")([^>]*?)>/i";
 $pattern[1] = "/<a(.*?)href=('|")([A-Za-z0-9/_.~:-]*?)(.bmp|.gif|.jpg|.jpeg|.png)('|")(.*?)(rel=('|")lightbox(.*?)('|"))([ trnvf]*?)((rel=('|")lightbox(.*?)('|"))?)([ trnvf]?)([^>]*?)>/i";
 $replacement[0] = '<a$1href=$2$3$4$5$6 rel="lightbox['.$post->ID.']">';
 $replacement[1] = '<a$1href=$2$3$4$5$6$7>';
 $content = preg_replace($pattern, $replacement, $content);
 return $content;
}
add_filter('the_content', 'lightbox_auto');

function my_get_attachment_link( $link, $id, $size, $permalink, $icon, $text ) {
 return preg_replace( '/s+title=/', " rel="lightbox[".$id."]" title=", $link );
}
add_filter( 'wp_get_attachment_link', 'my_get_attachment_link', 10, 6);

これで、「wp_contents」内の<a>タグに、強制的に「rel=lightbox」が追加されます。
実装してから少し時間が経っているので、もしかしたら抜けている部分があるかもしれませんが、そのときはすみません。