BuddyPress ITかあさん

ITかあさん

BuddyPressのデフォルトテーマとTwitterBootstrapベースになっているBuddyPressテーマ

BuddyPress2.3.4が10月に出ていますね、こんにちは。ITかあさんです

BuddyPressがver2出始めた辺りでほとんどBuddyPressを触らなくなってきてしまいましたが、ここにきてやっとBuddyPressを触る時間が取れそうで、久々に最新のBuddyPressをインストールしました。

BuddyPressのデフォルトテーマどこいった!

BuddyPressのインストールが完了!

BuddyPressのプラグインを有効にした後、前ならテーマ一覧にBuddyPressのデフォルトテーマが表示されたのに、いつの間にやら表示がされなくなってしまいました

でも安心して、ちゃんと僕はここにいるよ

BuddyPressのテーマの場所
ダウンロードしたBuddyPressのプラグインフォルダの中にちゃんとおります。

buddypress>bp-themas>bp-default

このbp-defaultがBuddyPressのデフォルトテーマになりますので、このbp-defaultフォルダを

wp-content>themes

WordPressのテーマフォルダに移動してあげることでテーマ一覧に表示されるされるようになります。

【テーマ一覧】

 おまけ BuddyPress  TwitterBootstrapベースに作られたテーマ

公式サイトからBuddyPressテーマを探しても良い物がないんですよね。
色々探して見つけたものを記載しておきしておきます。

Frmasite

公式サイトから。ただし、現行のWordPressバージョンでテストされていないよ!という警告が出ました。
Frmasite
動作確認したところ問題はないようでしたので、普通に使えるようです。

wpbootstrap

wpbootstrap
こちらは公式サイトにはありません。シンプルなBootsrapテーマですので、アレンジは非常にやりやすいのではないでしょうか?

BuddyPress2.2から登録時に会員の種別が追加出来るようになったよ!

待望機能!!BuddyPress2.2から登録時にユーザーの種別が選択出来る機能が追加された!

かあさんとしては、待ちにまった機能!これでBuddyPressで作る会員制サイトがパワーアップ出来るね!

これまでのBuddyPressって、自分の作ったBuddyPressのSNSに登録出来るユーザーは全てが同じ権限でした。
例えば学校向けのサービスを作ったとします。
すると、会員の権限は同じ。「生徒だったら生徒」それ以上のでもソレ以下でもデータ上は皆全て同じ扱いになってました。

新しいBuddyPressではbp_register_member_type()が追加されたよ!

bp_register_member_type()

以下は会員データ Studentの時。もちろん、これに対して、Teacherも作ることができます。

function bg_register_member_types() {
    bp_register_member_type( 'student', array(
        'labels' => array(
            'name'          => 'Students',
            'singular_name' => 'Student',
        ),
    ) );
}
add_action( 'bp_init', 'bbg_register_member_types' );

で、当然メンバータイプで分けられたデータは個別にstudentデータとteacherデータに分けてデータを引っ張ることもできるわけです!!

$member_args = array(
    'member_type' => array( 'student', 'teacher' ),
);
if ( bp_has_members( $member_args ) ) { 

これってかなり革新的な機能追加だと思っていて、これまでの場合だと、カスタムしたプロフィールデータに対して指定した値が入っているかをチェックしてqueryを投げるしか無かったのが、member_type一発で指定したタイプのmemberデータを取得出来るわけです。

これを活用することで、総合的なポータルサイトの作成出来るんじゃないかな!と思って、今からワクワクしています。
BuddyPressの今後にますます期待です!

参照元

Member Types BuddyPress Codex

BuddyPressでカスタムプロフィールを任意の場所に出す方法

BuddyPressでカスタムプロフィールを任意の場所に出す方法

引き続きBuddyPressネタをば!私がBuddyPressで好きなところは自由自在にカスタマイズ出来るカスタムプロフィールの機能です。
カスタムしたプロフィール欄

カスタムしたプロフィール欄。プロフィール項目はグループ分けすることが出来、入力していないものはデフォルトの設定では表示されないようになっているのもポイントで、ユーザーの種目ごとにプロフィールを分類させられます

BuddyPressでカスタムプロフィールを任意の場所に出す方法

カスタムプロフィールの出力

悪くはないけど、デフォルトではプロフィールにしかカスタムしたプロフィールは表示されません。

以下はテーマのファイルに書いて行きます。

メンバー一覧などの、ユーザーのループ中にカスタムプロフィールを表示する

$location= xprofile_get_field_data('住所' ,bp_get_member_user_id());

メンバーのループから外れいているときの取得

$location = xprofile_get_field_data('field=住所', $user_id);

$bp->displayed_user->userdata->IDで、現在表示中のユーザーが取得できます。以下の例でユーザーの個別のページを表示しているときにそのユーザーの住所が取得できます

global $bp;
$location = xprofile_get_field_data('field=住所', $bp->displayed_user->userdata->ID);

BuddyPressのmembersページで独自のフィルターでユーザーを絞り込む方法

BuddyPressのmembersページで独自のフィルターでユーザーを絞り込む方法

以前街のポータルサイトをBuddyPressで作ろう的な内容でワークショップ行いましたが、私自身実際に自分の住む街のポータルをBuddyPressで作るべく動いております。で、今回はそれにあたってmembersページを任意でデータを絞り込めないかと思って調べていたらできました、というご報告。

取得したパラメーターに保育園のパラメーターがあった場合、そのメンバーだけをフィルタリングして表示

指定したパラメータにマッチしたメンバーを表示するためにはSQLの知識のそこそこ必要なのですが、説明が長くなりそうなので割愛して、フィルタリングの方法だけ紹介します。BuddyPressで指定したカスタムプロフィールで、メンバーをフィルタリングして表示するプラグインは現在作成中なのでその際にでも紹介させて下さい。

指定したユーザーのIDでフィルターする

今回は上記URLを参考にやってみました。上記URLでは指定したメンバーをmembersページから除外していますね。

この記述はfunctions.phpまたは、bp-custom.phpに記載します。

//add_actionでbp_ajax_querystringにフック。
add_action('bp_ajax_querystring','bpdev_exclude_users',20,2);
function bpdev_exclude_users($qs=false,$object=false){
//list of users to exclude
 $excluded_user='1,2,3';//comma separated ids of users whom you want to exclude
 
 if($object!='members')//hide for members only
 return $qs;
 
 $args=wp_parse_args($qs);
 
 //check if we are listing friends?, do not exclude in this case
 if(!empty($args['user_id']))
 return $qs;
 
 if(!empty($args['exclude']))
 $args['exclude']=$args['exclude'].','.$excluded_user;
 else
 $args['exclude']=$excluded_user;
 
 $qs=build_query($args);
 
 return $qs;
}

もっと簡単に出来ないものかと試行錯誤したら、user_idよりデータを除外したり、検索するならたったの4行でいけました。
これで、ユーザーID 5、6、7以外のメンバーに絞り込めます

add_action('bp_ajax_querystring','bpdev_exclude_users',20,1);
function bpdev_exclude_users($qs=false){
 $qs='exclude=5,6,7';
 return $qs;
}

add_action関数でbp_ajax_querystringというフックにフィルターかけるだけなので、実際自分で書くところはこれだけ。
$qs=’exclude=5,6,7′;
return $qs;

当然、除外が出来れば指定したuser_idだけを表示出来るだろうと思っていて、excludeの反対はincludeだと思い、
これでuser_idが5,6,7のユーザーの取得に成功します

add_action('bp_ajax_querystring','bpdev_include_users',20,1);
function bpdev_exclude_users($qs=false){
 $qs='exclude=5,6,7';
 return $qs;
}

後は特定のカスタムしたプロフィールの項目にチェックが入っているかはSQLを使う必要があり、だいたいSQLはこんな感じになります。
wp_bp_xprofile_dataテーブルにどのuser_idが何の拡張プロフィールのデータを入れているか(field_id)が格納されています。

あとは、取得したuser_idのデータを配列からカンマ区切りの文字列にすればOK.
拡張プロフィールのユーザの取得について、もう少し楽だったらな〜というのが正直なところ。

global $wpdb;
$user_id = $wpdb->get_results( "SELECT * 
  FROM  `wp_bp_xprofile_data` 
  WHERE  `field_id` ={$_GET['category_id']}
  AND  `value` LIKE  '%{$_GET['category_name']}%'" );
$include_user = "";
  foreach ($user_id as $user_id) {
  $include_user .= $user_id->user_id.',';

BuddyPressのユーザーページに投稿機能とユーザー投稿一覧

BuddyPressのユーザーページに投稿機能とユーザー投稿一覧を作ってみたよ


BuddyPressの優れたユーザーページをカスタマイズして、ユーザー投稿型の会員制サイトを作ってみたいな〜と思っていました。
BuddyPressのカスタマイズユーザーページ

カスタマイズされたユーザーページのサンプルはこちら

WordPressのゲスト投稿機能でよく使われるwp_insert_post()関数を利用して、表示されているユーザーIDを取得して、そのIDの投稿記事だけを各ユーザー毎に表示します。

BuddyPressのサンプルでよく紹介されるサイトにレシピサイトの Tasty Kitchenがあるのですが、おそらく同じような方法で各ユーザー毎の投稿レシピを表示しているのかと(あくまで予想ですが・・)
Tacty Kitchen

ユーザー側の投稿システムを整備してあげればBuddyPressがSNS意外の楽しい会員制になり得るのではないかと思い、今回はこのBuddyPressのユーザーページに投稿機能と各ユーザーの投稿記事の取得したいと思います。

なお、今回はBuddyPress前提で紹介しますが、管理画面以外からの記事投稿の仕組みの参考にもなるかと思います。

では次のページから具体的にBuddyPressのユーザーページに投稿機能を組み込み方法を紹介します。

BuddyPressのユーザーページにオリジナルページを追加しよう

BuddyPressのユーザーページにオリジナルページを追加しよう


BuddyPressには元々機能的には大変優れたユーザーページがあります。
(デザイン的にはいかにもBP使ってます感があってイマイチよね~、という意見もありますが・・・)

そんな訳でBuddyPressのユーザーページのカスタマイズ第一弾として、

ユーザーメニューの追加や順番の入れ替え、サブページの新規追加のカスタマイズについてお送りします。

BuddyPressのfunction.phpについて

WordPressのテーマにはfunction.phpがあって、テーマの設定やちょっとしたプログラムをコイツに書いたりしますね。
しかし、BuddyPressのテーマフォルダにfunction.phpを書いてもダメです。

bp-custom.php

WordPressのテーマ作成でお馴染み、function.phpのBuddyPress版みたいなファイル、
それがbp-custom.php

WordPressのテーマ作成でちょっとした設定などをテーマフォルダのfunction.phpに書くことが多いと思いますが、
このBuddyPress版とも言うべきファイルがbp-custom.php。
pluginsフォルダディレクトリの直下に設置します。

bp-custom.php
今回のユーザーページのカスタマイズ方法については全てこのbp-custom.phpに記入してゆきます。

ユーザーページ メニューのカスタマイズ

では、BuddyPressのメニューカスタマイズについて紹介します。
下の画像はデフォルトの状態のユーザーページです。

デフォルトのBuddyPressユーザーページ

親メニューを追加する

ここからは実際にbp-custom.phpを編集して、ユーザーページメニューをカスタマイズしてゆきます。
BuddyPressのユーザーページのメニューには、親メニューとサブメニューの2つがあります。

メニューを追加するときはadd_actionを使います。

add_action( ‘bp_setup_nav’, ‘関数名’);
//ユーザーメニューを追加
  add_action( 'bp_setup_nav', 'works_nav');
//ユーザーメニュー追加の独自関数をセット
  function works_nav() {
  global $bp;
  bp_core_new_nav_item( array( 
  'name' => '実績', 
  'slug' => 'works', 
  'position' => 75,
  'screen_function' => 'works',
  'show_for_displayed_user' => true,
  'default_subnav_slug' => 'works',
  'item_css_id' => 'works'
  ) );
  }

オプションについては以下の通り

  • name…メニューでの表示名
  • slug…スラッグ
  • position…追加メニューの表示場所。数値が大きければ右側に、小さければ左側に。一番左に表示したければ数値は0にします
  • screen_function…例の通りだと追加メニューのURLはhttp://hoge.com/members/ユーザーID/works/となります。
  • show_for_displayed_user…ユーザーに表示するかしないか、true OR false
  • default_subnav_slug…メニューをクリックした時に最初に表示されるサブメニューの指定
  • item_css_id…追加メニューに割り当てられるID名。例だとid="user-works"と、なる

たったこれだけでメニューが追加されます。

ユーザーページの追加
ただし、実際にこれだけではメニューをクリックしてもページが表示されません。
default_subnav_slug というオプションで、サブメニューページ「works」を設定しているからで、
今回のケースだと最低一つのサブメニューを設置しないとオリジナルのユーザーページが表示されません。

サブページを追加する

先ほど追加した親メニューの下に子ページ(サブページ)を追加します。これも書き方のフォーマットが決まっているので簡単です
screen_functionというオプションでworksという関数名を指定したので、以下の通りになります。

function works () {
add_action( 'bp_template_title', 'works_title' );//カスタムユーザーページに見出し
add_action( 'bp_template_content', 'works_content' );//カスタムユーザーページに表示したい内容
bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'members/single/plugins' ) );//テーマファイルの呼び出し(この記述で、メンバーページのファイル)
}

//これでカスタムしたユーザーページにタイトルが表示される
function works_title() {
	echo '実績一覧';
}

//これでカスタムしたユーザーページに表示したいコンテンツ
function works_content() {
	include_once "buddypress/custom_user/works_content.php";   
}

オプションについては以下の通り

  • bp_template_title…カスタムユーザーページに見出し
  • bp_template_content…カスタムユーザーページに表示したい内容
  • bp_core_load_template…例の記述でメンバーページのテーマファイルの呼び出し

bp_template_contentで指定したfunction内にHTMLなど書いてもよいのですが、bp-custom.phpがごちゃごちゃしすぎてしまうので、私はbuddypress内にcustom_userフォルダを作成し、そこにworks_content.phpを設置しました。includeさえ出来れば結局はどこでもいいのかな、と。

works_content.phpの中身は今回はただのHTMLファイルです。


ここまででやっとペラっとしたユーザーページの追加が完了です。ここまでのコードをまとめて記述しておきます。

/*BuddyPressユーザーページにメニューの追加だよ*/
//ユーザーメニューを追加
add_action( 'bp_setup_nav', 'works_nav');
//ユーザーメニュー追加の独自関数をセット
function works_nav() {
global $bp;
bp_core_new_nav_item( array( 
'name' => '実績', //メニューの表示名
'slug' => 'works', //スラッグ名
'position' => 75,//追加メニューの表示順位
// http://hoge.com/members/ユーザーID/works/ と、なる 
'screen_function' => 'works',
'show_for_displayed_user' => true,//ユーザに表示するか
'default_subnav_slug' => 'works',//ユーザに表示するか
'item_css_id' => 'works'//メニューにIDを付与
));
}
  
function works_title() {
echo '実績一覧';//追加したユーザーページのタイトル
}
  
function works () {
add_action( 'bp_template_title', 'works_title' );//カスタムユーザーページに見出し
add_action( 'bp_template_content', 'works_content' );//カスタムユーザーページに表示したい内容
//テーマファイルの呼び出し(この記述で、メンバーページのファイル)
bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'members/single/plugins' ) );
}

やっとページとして表示される

追加したメニューに、オリジナルサブページを追加する

ここまででメニューが一つ追加されたわけですが、どんどんサブページを追加したいですね!
同じ要領で追加が可能です。

サブページをさらに追加する

先ほど追加した親メニューにさらに子ページ(サブページ)を追加してゆきます。

サブメニューの順番を変更したい場合は第三引数の数値を変更してください。

既に設定が完了している先ほどのサブページでもメニューに表示させるためには再度ここで定義します。

/*子ページの追加だよ*/
add_action('bp_setup_nav', 'work_list_subnav_tab', 100 );

function work_list_subnav_tab() {
global $bp;
bp_core_new_subnav_item( array(
'name' => '実績一覧',
'slug' => 'work_list',
'parent_url' => trailingslashit( $bp->displayed_user->domain . 'works' ),
'parent_slug' => 'works',
'screen_function' => 'works',
'position' => 50
)
);
}
  • name…サブメニューの見出し
  • slug…スラッグ
  • parent_url…親ページのURL。ここでは最初に追加したページを指定
  • parent_slug…親ページのスラッグ
  • screen_function…表示したいコンテンツを関数で指定
  • position…サブメニューの表示順位(add_actionでも設定できる)

ここまで記述すると、先ほど追加したコンテンツが、サブメニューとして出力される

サブメニューとして追加

さあ!どんどんサブページを追加しよう!

もっとたくさんサブページが欲しいですね!どんどんサブページを追加していきましょう!

さらにサブページを追加する

サブページの追加方法は先ほどとあまり変わりませんが、親ページの設定は常に忘れないようにしましょう。

add_action('bp_setup_nav', 'portfolio_view_tab', 100 );
function portfolio_view_tab() {
  global $bp;
  bp_core_new_subnav_item( array(
  'name' => 'ポートフォリオ',
  'slug' => 'portfolio',
  'parent_url' => trailingslashit($bp->displayed_user->domain . 'works' ),
  'parent_slug' => 'works',
  'show_for_displayed_user' => true,
  'screen_function' => 'portfolio_action',
  'position' => 50
  )
  );
  }
function portfolio_action () {
  add_action( 'bp_template_title', 'portfolio_action_title' );//カスタムユーザーページに見出し
  add_action( 'bp_template_content', 'portfolio_action_content' );//カスタムユーザーページに表示したい内容
  bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'members/single/plugins' ) );//テーマファイルの呼び出し(この記述で、メンバーページのファイル)
  }
function portfolio_action_title() {
  echo 'ポートフォリオ';
  }
function portfolio_action_content() {
  include_once "buddypress/custom_user/works_portfolio.php"; 
  }

ここまで追加できると、オリジナルカスタムページの幅が広がりそうですね~

さらに追加したサブページ

おまけ。ログイン時のみ表示されるカスタムページ

現在作成中のBuddyPressでのポータルサイトなのですが、ユーザーログインしている時のみ、投稿したり編集したりするページを作成予定です。
ログインしている時だけ表示するような、制限付のページも追加出来ます。

ログイン中のユーザーと現在表示中のユーザーが同じ場合のみページを表示させる点、
一般公開したくないページについてはshow_for_displayed_userがfalseになるという点だけ注意してください。

add_action('bp_setup_nav', 'work_list_add_tab', 100 );

function work_list_add_tab() {
global $bp;
//ログインユーザーと表示中のユーザーが同じ場合のみサブページを表示
if($bp->loggedin_user->id != $bp_displayed_user_id){
bp_core_new_subnav_item( array(
'name' => '実績追加',
'slug' => 'work_add',
'parent_url' => trailingslashit( bp_loggedin_user_domain() . 'works' ),
'parent_slug' => 'works',
'show_for_displayed_user' => false,//一般的に表示させたくない場合はfalse
'screen_function' => 'works_add',
'position' => 50
)
);
}
}

function works_add () {
	add_action( 'bp_template_title', 'works_add_title' );//カスタムユーザーページに見出し
	add_action( 'bp_template_content', 'works_add_content' );//カスタムユーザーページに表示したい内容
	bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'members/single/plugins' ) );//テーマファイルの呼び出し(この記述で、メンバーページのファイル)
}

function works_add_content() {
	include_once "buddypress/custom_user/works_add.php";
}

function works_add_title() {
	echo '実績追加';
}

ログイン時しか表示されないサブページ
ずい分長くなってしまいましたが、ざっとBuddyPressでのユーザーページ追加のカスタマイズについては以上です。
次ページに今回作ったコードを載せておきますので、よろしければお使い下され~い。

WordPressのマルチサイトをブログポータル化するプラグインMulti Site Category作った

WordPressのマルチサイトをブログポータル化するプラグインMulti Site Category作った!

ご無沙汰してます、半月ほとブログ更新をお休みしまして、この度人生初のWordPressプラグインを作ってみました。

ITかあさんプラグイン処女作、Multi Site Categoryとは

これだけブログ内でもWordPressネタやっているんだから、いい加減プラグインの一つでも作ってみますかな、ということで作ってみました。
WordPress3.xより、メインブログの下に子サイトを持たせるマルチサイト化の機能が搭載されましたが、どうせなら

マルチサイトをカテゴリーごとに分類したい!そしてブログポータルを作ってみようじゃないか!

と、いう方には最適なプラグインになっている・・・はず。


任意でサイトをカテゴリー分類して、子サイトの最新記事を、更新順に表示します。

Multi Site Categoryの使い方

それではMulti Site Categoryの使い方を説明いたします。使い方はとっても簡単です。

なお、Multi Site Categoryはマルチサイト化されていることが大前提となっております。

1.Multi Site Categoryを有効化する

とにもかくにも『ネットワークで有効化』してください。
ネットワークが有効化されると、

wp_blogs_type
wp_blog_category

この2つのテーブルが生成され、さらに WordPressの固定ページで『Blogs』ページが追加されます。

もし何らかの不具合でこの2つのテーブルが生成されない場合(Mysqlのユーザーの権限の問題かと・・)
以下のSQLをphpMyadminなどから実行して下さい。

wp_blogs_typeテーブルを生成するSQL

CREATE TABLE wp_blogs_type (
id int(11) NOT NULL AUTO_INCREMENT,
category_id int(11) NOT NULL,
blog_id int(11) NOT NULL,
PRIMARY KEY (id)
)
CHARACTER SET ‘utf8’

wp_blog_categoryテーブルを生成するSQL

CREATE TABLE wp_blog_category(
id int(11) NOT NULL AUTO_INCREMENT,
sort int(11) NOT NULL DEFAULT ‘0’,
name varchar(255) NOT NULL,
PRIMARY KEY (id),
KEY sort (sort)
)
CHARACTER SET ‘utf8’

固定ページBlogsを生成する

INSERT INTO wp_posts (post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count) VALUES
(1, NOW(), NOW(), ”, ‘Blogs’, ”, ‘publish’, ‘closed’, ‘closed’, ”, ‘blogs’, ”, ”, NOW(), NOW(), ”, 0, ”, 0, ‘page’, ”, 0)

2.サイトのカテゴリーを追加する

一応インストだけで初期設定は完了していますが、ブログのカテゴリーを登録しないと、そもそも分類出来ませんね。

プラグインインスト時に追加された、サイトカテゴリ>カテゴリの追加から、ブログのカテゴリーを追加してください。


この項目は親サイト側からでないと追加出来ません!

3.各サイトがどのカテゴリーか登録する

サイトがどのカテゴリーに分類されるかを登録します。サイトカテゴリトップでマルチサイト一覧を確認して下さい。
現在登録されているサイト一覧が並んでいるので、編集ボタンをクリックして下さい。

マッチしたものにチェックを入れて決定します。

この項目は子サイト側から、自分がどこのカテゴリーにマッチしているか登録出来ますが、自分のサイト以外は登録出来ません。

3.ウィジェットに追加

ここまで出来たら後はウィジェットにプラグインを追加するだけです。


完成!ブログポータル



ここまで来ると、なんかブログポータルっぽいぞ!

カスタマイズ(レイアウト面とか、ページャーとか)

ある一定の件数でページングしたいなどあるかと思います。
自分のブログ記事単体をページングするなら色々情報などありましたが、オリジナルのSQLに対してページングするのによい方法が見つからず、

PEAR:pager

を使いました。PEARは再配布OKとのことで、このプラグインに同梱させてもらいました。

表示を変更するならcategory_site.phpファイル

ブログの一覧の表示や、ページング数を変更したい時はcategory_site.phpを変更してください。

$perPage=10;//1ページあたりの表示件数

ページングしているときの表示例ですが、こんなカンジ



ブログ一覧のHTMLなどもこのファイルなので、適時変更していただければと思います。

Multi Site Categoryダウンロード

ダウンロードは一先ずこちら。出来立てほやほやなので、まだ公式に登録してません。

後日公式に登録しますが、一先ずこちらからどぞ~。

補足:BuddyPress環境以外の方

当プラグインが、個人的にBuddyPressの環境でマルチサイトをカテゴリー化したいがために作ったプラグインで、BuddyPress意外のマルチサイト環境ではあまり検証しておりませんでしたのでお詫びいたします。

category_site.phpファイルの59行目は、BuddyPressでユーザープロフィールページへのリンクを呼び出す関数なので、BuddyPress環境でない方はこの部分を削除してみてください。

何分初めて作ったプラグインですので不具合など多々あるかとは思いますが、色々ご意見など頂き、今後の改善に努めたいと思います。

WordPressのマルチサイト化したサイトの最新記事

マルチサイト化したWordPressから最新記事を取得する

このところBuddyPressにすっかりハマってしまったITかあさんですが、BuddyPressでのマルチサイトでポータル作りたい構想がありまして、マルチサイト化したWordPressから最新記事を取得する方法を紹介したいと思います。

WordPressマルチサイトネットワークから新着記事を取得するコード

基本的なコードはこちらが大変参考になります。基本は私もこちらを使わせて頂きました。

テーマフォルダのfunctions.php

テーマのfunctions.phpを編集します。BuddyPressテーマも同様です。
こちらのページからget_recentposts_from_networkのfunctionを頂くのですが、カスタマイズ案としてこの部分を

$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id FROM wp_blogs ORDER BY blog_id" ) );

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓このようにしました

$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id FROM wp_blogs WHERE NOT(blog_id=1) ORDER BY blog_id" ) );

また、マルチサイトの最新記事を引っ張る部分 foreach( $posts as $post ) {}の括弧内に以下を追加しました

$author = $post->post_author;//投稿者
$thumbnail_id = get_post_thumbnail_id($post->ID);
$thum = wp_get_attachment_image_src( $thumbnail_id, array( 100, 100 ) );//投稿記事サムネイル取得
$post->thum = $thum[0];//投稿記事サムネイル
$post->author = get_avatar($post->post_author, '50');//投稿者のアバター(必要なければ消してね)

これは、各テンプレートのindex.phpなどでサムネイルなど取得してもいいのですが、どちらにせよこの部分は後でキャッシュ化してしまうので、
最新記事関連の項目は全てfunctions.php内で完了させておいたほうが賢いでしょう。

Transients APIを使ってキャッシュしつつ最新記事表示

前回の記事の通り、マルチサイトのデータベースを分離してしまったので、取得にそれなりの時間がかかってしまうであろうこのスクリプト。Transients APIを使ってキャッシュしつつ、テンプレート側に表示させます。

<?php
$network_posts = get_transient( 'transient_key' );
  if ( $network_posts === false ) { 
  $transients = get_recentposts_from_network( 'perblog=3' );
  set_transient( 'transient_key', $transients, 3600 * 24 );//第3引数にはキャッシュさせる時間
  $network_posts = get_transient( 'transient_key' );
  }
 
  if( $network_posts ) :
  
  foreach( (array) $network_posts as $key => $post ) {
  switch_to_blog( $post->blog_id );
  setup_postdata( $post );
  ?>
  <li><?php the_author(); ?><?php if($post->thum !=""):?><span><img src="<?php echo $post->thum;?>" width="50" height="50"><?php endif;?></span><a href="<?php the_permalink() ;?>"><?php the_title(); ?></a></li>
  <?php
  restore_current_blog();
  }
  wp_reset_query();
  
  endif;
?>

実行例

マルチサイトから最新記事を表示
こんな風に表示されます。データベースを分離させたマルチサイトでも全く問題なく取得できます。

当初このキャッシュ方法をWordPressのobject cashe使おうとして、全くキャッシュ保存されないことで躓き、ご指南頂きました。
WordPressのオブジェクトキャッシュで躓いた

プラグインを入れることなく、簡単にキャッシュ実装できました。ありがたや、ありがたや~

BuddyPressのマルチサイトのデータベースを分離したい!

BuddyPressのマルチサイトのデータベースを分離したい!

BuddyPressのマルチサイト データベースの分離をしたい
ここ数週間、ずっとBuddyPressで作ったマルチサイトもとい、WordPressでのマルチサイト化に伴いデータベースの肥大化に対応するにはどうしたらよいものかとずっと考えてきましたが、やはり

マルチサイトをある程度の個数で、データベースを分離させる

ということを考えたほうがいいという結論を自分の中で出しました。

なぜデータベースを分離させるのか

実際にマルチサイトごとのデータベースの分離の手順に説明する前に、なぜマルチサイトをある程度のところでデータベースを分離させたほうがよいのか、熱く語ってもよいでしょうか?

理由 テーブル数が超やばい

マルチサイトをどんどん展開させていくといずれヤバくなるのがこのテーブル数の問題です。
下の画像は、一つのマルチサイトで生成されるテーブルです。

マルチサイトを一つつくると9個のテーブルが生成される

ということを頭いいれてほしいのですが、ではこれが仮に100個マルチサイトが出来ると、900個のテーブルが生成されるわけです。
1000個のマルチサイトで9000個のテーブルが出来るわけ
ですね。

だからどうした? と、今思いましたね?

え?別に何個作ったって、マルチサイトが出来ればそれでいいじゃん!

そう思っていませんか?でも、データベースのテーブルの正体を知ると、そうもいえなくなりますよ。

データベースに1テーブルで一つのファイル

データベースに1つテーブルを作ると、1つのファイルが生成されるのはご存知ですか?プログラムをがっつりやっていないとあまり気にしないかもしれませんね。

Mysqlのdataディレクトリには、データベースごとのディレクトリが用意され、そしてその中にテーブルごとのファイルが生成されていきます。

1つのマルチサイトで9つのファイルが生成され、マルチサイトがどんどん増えていくと、いずれこのフォルダはいっぱいになりますね。

システムファイル数の限界

多くはLinuxをWEBサーバーにしてサイトを作られていることでしょうが、システムファイル数の限界をご存知でしょうか?
1つのフォルダに何個のファイルを置くことが出来るかと言う問題です。

この件に関しては、こちらの掲示板での議論を参考にされるとよいかもしれません。

1つのディレクトリではいつか限界が・・・

どこで1つのデータベースでテーブルを複数作るのをストップさせるかは考えたほうがいいですが、どこで止めたほうがいいかというと、
私の個人的な意見も交えますと

2000~3000くらいでストップ

させるのがいいかと。

これはどのようなプログラムを作っていても、ある程度システムファイルや、ログファイル、キャッシュファイルはいくつかのディレクトリに分散させるのがプログラムの常識です。(あるいは、ある程度でキャッシュを削除するなど)

1つのディレクトリでウン万単位のファイルがあったら、見るだけでぞっとしませんか?

それに、ウン万のテーブルがあるデータベースをphpMyadminで開けると思いますか?無理です。

phpMyadminでも管理しきれない、ディレクトリに作れるファイル数にも限界があるということで、私ならマルチサイトは一つのデータベースでは最高でも

200~300くらいでストップ

が限界だと思うし、phpMyadminで管理させたければ100くらいで止めるべきです。

ただし、細かく分散させすぎると、それはそれで重たくなってしまうため、注意が必要です。

管理が大変面倒になる
ファイル数の限界が来る

大きくわけて2つの理由でマルチサイトはデータベースの分離をさせたほうがよいよ、ということをITかあさんは熱く あつく提案したいと思います。

あとは、うっかりデータベースを削除した時も(あまりないけど) リスクの分散も出来ますしね。

前置きが長くなりましたが、マルチサイトによるデータベースの肥大化に対抗するべく、

について説明したいと思います。

XAMPP(ローカル)環境でBuddyPressのマルチサイトが作りたい!その2

どうしてもXAMPPでBuddyPressのマルチサイトが作りたい!その2


BuddyPressに関する記事もこれで3回目ですが、いよいよBuddyPressでマルチサイトを作る方法です。いい加減本物のWEBサーバー環境でやってもいいのですが、やはりローカルの手軽さから、サービス完成のその日までXAMPPとお付き合いしたいと思います。
以前もXAMPPのマルチサイト化については記事を書いたのですが、今回はBuddyPressのマルチサイト化の手順をメインに解説したいと思います。

URLにポート番号が混じっているとマルチサイト化できない

ローカル環境でやっていると、ポート番号形式でバーチャルホスト化する人も多いと思いますが、WordPressのマルチサイトに関してはポート番号が混じっているのはNGのようなので、先にこちらの記事を参考に URLにポート番号が入らないようにしてください。

XAMPPからPHPのメールが送信できるようにする

設置したBuddyPressからユーザー登録確認メールが送信できるようにしないといけません。
ただXAMPPのPHPからメールを送信するだけならMercuryは使わなくても大丈夫です。
XAMPPのphp.iniだけ設定変更すればいいのです。

php.ini

XAMPPのphp.iniは以下のphpフォルダの中に存在します。

C:\xampp\php

以下のように、SMTPサーバーを設定します。
このSMTPサーバーは普段使っているプロバイダのものでかまいません。

mail functionの設定をします。今回のように、登録確認メールをただ送信するだけなら、SMTPだけちゃんと設定されていれば問題ありません。
上書きしたら、Apacheを再起動して、準備は完了です。

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = smtp.mail.yahoo.co.jp
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = postmaster@localhost