Open12

bbpressの関数まとめ

Ryota|CRAFT BOXRyota|CRAFT BOX

サービス開発にあたりbbpressを使ったフォーラム カスタマイズをする必要があったのですが、調べても設定方法しか出てこなかった(基本的に英語しか出てこない。。)ので、自分がこのサービスを作る上で使ったデフォルトにあるfilterや関数をまとめていきます。

おいおいは記事にして本にできればいいけど、そこはまぁ気が乗ればということで。。

それではいきましょう٩( 'ω' )و

Ryota|CRAFT BOXRyota|CRAFT BOX

bbpressのデフォルトCSSを読み込まないようにする

functions.php
add_action('wp_print_styles', 'deregister_bbpress_styles', 15);
function deregister_bbpress_styles()
{
	wp_deregister_style('bbp-default');
}
Ryota|CRAFT BOXRyota|CRAFT BOX

bbpressの関数にadd_filterを追加してクラス名を変更する

functions.php

function sample_callback($retval)
{
    // Parse arguments against default values
    $r = bbp_parse_args($args, array(
        'id'           => 0,
        'link_before'  => '',
        'link_after'   => '',
        'edit_text'    => esc_html__('Edit', 'bbpress')
    ), 'get_reply_edit_link');

    // Get reply
    $reply = bbp_get_reply($r['id']);

    // Bypass check if user has caps
    if (!current_user_can('edit_others_replies')) {

        // User cannot edit or it is past the lock time
        if (empty($reply) || !current_user_can('edit_reply', $reply->ID) || bbp_past_edit_lock($reply->post_date_gmt)) {
            return;
        }
    }

    // Get uri
    $uri = bbp_get_reply_edit_url($r['id']);

    // Bail if no uri
    if (empty($uri)) {
        return;
    }

    $retval = $r['link_before'] . '<a href="' . esc_url($uri) . '" class="a--link -reply ">' . $r['edit_text'] . '</a>' . $r['link_after'];
    return $retval;
}
add_filter('bbp_get_reply_edit_link', 'sample_callback');

Ryota|CRAFT BOXRyota|CRAFT BOX

出力関数一覧。
(基本ループ内)

single.php
// トピックのフォーラム名を取得
bbp_topic_forum_title();

// トピックタイトルを取得
bbp_topic_title();

//ユーザー名を取得
bbp_topic_author_display_name()

//日付取得
bbp_topic_post_date()

//パンくず取得
bbp_breadcrumb()

// タグリスト取得(リンクあり)
bbp_topic_tag_list()

// リプライ先リンクを取得
bbp_reply_url()

// リプライid取得
bbp_reply_id()

Ryota|CRAFT BOXRyota|CRAFT BOX

bbpressでもなんでもそうだが、フックやfilterが用意されているプラグインやテーマであれば基本的にその関数を使ってカスタマイズしたりする。

add_fileterでフィルターを追加して変数を返したり、別の処理を追加したり。。

Ryota|CRAFT BOXRyota|CRAFT BOX

bbpressのショートコード一覧

shortcode.php

// フォーラム関連のショートコード
[bbp-forum-index] – フォーラム全体のインデックス
[bbp-forum-form] – 新規に作成したフォーラムのページ
[bbp-single-forum id=$forum_id] – フォーラムのトピック($forum_idには表示させたいフォーラムのidを入力)

//トピック関連のショートコード
[bbp-topic-index] - 全てのフォーラムから最新15トピックを表示
[bbp-topic-form] - トピックの新規作成ページを表示
[bbp-topic-form forum_id=$forum_id] - IDで指定したフォーラムの最新トピックを表示
[bbp-single-topic id=$topic_id] - IDで指定したトピックを表示

// 返信関連
[bbp-reply-form] - 返信フォームを表示
[bbp-single-reply id=$reply_id] - 指定したIDの返信を表示

//タグ関連
[bbp-topic-tags] - 全てのトピックタグを表示
[bbp-single-tag id=$tag_id] - 指定したIDのトピックタグを表示

//閲覧関連
[bbp-single-view id=’popular’] - 人気のビューを表示
[bbp-single-view id=’no-replies’] - 返信がないビューを表示

//検索関連
[bbp-search] - 検索フォームを表示
[bbp-search-form] - テンプレートから検索フォームを表示

// ログイン・登録
[bbp-login] - ログイン画面を表示
[bbp-register] - 登録画面を表示
[bbp-lost-pass] - パスワードを忘れた場合の画面を表示

// フォーラム統計情報
[bbp-stats] - フォーラムの統計情報を表示

参照元 : shortcodes - bbPress Codex

Ryota|CRAFT BOXRyota|CRAFT BOX

WordPressの標準の検索機能にbbpressで作成したトピックやフォーラム、リプライも検索に引っかかるようにする。

functions.php

// トピック
function sample_bbp_topic_search($topic_search)
{
    $topic_search['exclude_from_search'] = false;
    return $topic_search;
}
add_filter('bbp_register_topic_post_type', 'sample_bbp_topic_search');

// フォーラム
function sample_bbp_forum_search($forum_search)
{
    $forum_search['exclude_from_search'] = false;
    return $forum_search;
}
add_filter('bbp_register_forum_post_type', 'sample_bbp_forum_search');

// リプライ
function sample_bbp_reply_search( $reply_search ) {
    $reply_search['exclude_from_search'] = false;
    return $reply_search;
}
add_filter( 'bbp_register_reply_post_type', 'sample_bbp_reply_search' );

Ryota|CRAFT BOXRyota|CRAFT BOX

どうしてもbbpressのトピックに対する返信の階層構造と出力内容に納得できなかったので修正。
具体的に何が納得いかなかったのかというと、トピックに対する返信を取得して表示させたい時に何故か「トピックの内容」も一緒に表示されてしまうこと。

bbpress.php

// bbp_list_repliesの中身
function bbp_list_replies( $args = array() ) {

	// Get bbPress
	$bbp = bbpress();

	// Reset the reply depth
	$bbp->reply_query->reply_depth = 0;

	// In reply loop
	$bbp->reply_query->in_the_loop = true;

	// Parse arguments
	$r = bbp_parse_args( $args, array(
		'walker'       => new BBP_Walker_Reply(),
		'max_depth'    => bbp_thread_replies_depth(),
		'style'        => 'ul',
		'callback'     => null,
		'end_callback' => null,
		'page'         => 1,
		'per_page'     => -1
	), 'list_replies' );

	// Get replies to loop through in $_replies
	// $bbp->reply_query->postsに内容が配列で入ってる
	echo '<ul>' . $r['walker']->paged_walk( $bbp->reply_query->posts, $r['max_depth'], $r['page'], $r['per_page'], $r ) . '</ul>';

	$bbp->max_num_pages            = $r['walker']->max_pages;
	$bbp->reply_query->in_the_loop = false;
}

これが原因で返信だけを出力したいので余計なトピックの内容までついてきて使いづらいのなんの。。
var_dumpで中身を見てみると、配列の最初にトピックの内容が格納されていたので、

bbpress.php

// Get replies to loop through in $_replies
array_shift($bbp->reply_query->posts);
echo '<ul>' . $r['walker']->paged_walk($bbp->reply_query->posts, $r['max_depth'], $r['page'], $r['per_page'], $r) . '</ul>';

array_shiftで最初の配列だけ削除してことなきを得ました。