BuddyPressにもBuddyPress Portfolioにも詳しくないので的外れなコメントになるかもしれませんが、調べたことを書いてみたいと思います。
BuddyPress Portfolioバージョン1.0のテンプレートファイルを覗いてみたところ、下記のようなループがありました。ファイルはtemplates/default/personal.php
です。
<?php while ( bp_portfolio_has_items(array('author_id' => bp_displayed_user_id(), 'posts_per_page' => -1)) ) : bp_portfolio_the_item(); ?>
//途中省略
<?php bp_portfolio_item_title() ?>
//途中省略
<?php bp_portfolio_item_description() ?>
//途中省略
<?php endwhile; ?>
これを見ると、WordPressの基本的なループと似ていると思いました。
bp_portfolio_has_items
が WordPressの have_posts
、 bp_portfolio_the_item
が the_post
に似ているみたいです。ただし、WordPressの have_posts
にはパラメータがありませんが、 bp_portfolio_has_items
は検索条件をパラメータにできるようです。
これがもし本当なら、bp_portfolio_has_items
のパラメータにソート順を指定できるかもしれません。WordPressの基本的なループだと、ソート順をランダムにするには 'orderby' => 'rand'
を指定するので、これがBuddyPress Portfolioにも当てはまるかもしれません。
ghvstさん、ご返信ありがとうございます。
orderbyは試してみたのですがうまくいきませんでした。
以下の関数の$default = array(~省略~)の中身が指定できるパラメータだと理解していますがorderbyはありません。(←この理解が正しいのかは分かりません泣)
function bp_portfolio_has_items( $args = array() ) {
//途中省略
$default = array(
‘id’ => 0,
‘author_id’ => $user_id,
‘title’ => null,
‘description’ => null,
‘url’ => null,
‘created_at’ => date( ‘Y-m-d H:i:s’ ),
‘updated_at’ => date( ‘Y-m-d H:i:s’ ),
‘tags’ => array(),
‘posts_per_page’ => 10,
‘page’ => 1,
‘search_terms’ => null
);
//以下省略
idを取得してシャッフルしてパラメータに挿入すればできそうですが、今の私には技術的にそれをできるレベルにないためどなたか教えて頂けると助かります(泣)
別のところに orderby
を入れてみたらランダムな順に変わりました。
buddypress-portfolio/include/bp-portfolio-classes.php
です。
オリジナルは
public function get( $args = array() ) {
if(empty($this->query)) {
//途中省略
$query_args = array(
'post_status' => 'publish',
'post_type' => 'portfolio',
'posts_per_page' => $this->num,
'paged' => $this->prpage,
'meta_query' => array(),
);
//途中省略
$this->query = new WP_Query( $query_args );
//途中省略
}
}
この $query_args
の array
に 'orderby' => 'rand'
を加えました。
ghvstさん、同じように$query_argsに’orderby’ => ‘rand’を付け足したらできました!
ですがこの状態でポートフォリオのアップロードをするとdescriptionにリンクが張られるという通常は発生しない現象が現れるようになりました。。
‘orderby’=>’rand’を削除して再度アップロードをするとdescriptionのリンクはなくなるのでこれが原因かと思われます。
ghvstさんにご教示頂いたpublic function getの部分を読み解きながら試行錯誤した結果、思い通りの挙動を実現できましたので解決とさせていただきます^^
コードは以下の様にしました。
プラグインファイルを触っていないのでアップデートしても引き継がれるかと思います。
<?php
$args = array(
'posts_per_page' => 6,
'post_type' => 'portfolio',
'orderby' => 'rand'
);
$wp_query = new WP_Query($args);
?>
<?php if ($wp_query->have_posts()):while($wp_query->have_posts()):$wp_query->the_post(); ?>
<?php $pic = wp_get_attachment_image_src($post->post_parent);?>
<img src='<?php echo $pic[0] ?>'>
<?php the_title();?>
<?php echo apply_filters('the_content', $post->post_content); ?>
<?php echo bp_core_get_user_displayname(bp_portfolio_get_user_id()) ?>
<?php endwhile; endif;wp_reset_postdata(); ?>
ghvstさん、とても勉強になりました。ありがとうございました^^