サポート » プラグイン » Buddypress Portfolioの並び順をランダムにしたい

  • 解決済 ooshirotakashi

    (@ooshirotakashi)


    WordPress及びプログラミング言語を学んだことがない初心者です。
    1年程前からWordpressでウェブサイト作りをしています。

    現在Buddypressとマルチサイトを併用したサイトを作っています。

    Buddypress Portfolioというプラグインを使用しており、ランダムに表示をしたいのですがソートの仕方が分かりません。

    そもそもorderbyの様なオプションが無いようです。

    関数等を作成してどうにかランダム表示を実現したいのですが、自力でPHPが書けないため分かりません。

    探しても情報がないため、どなたかご教示お願いします><

    Buddypress Portfolioの関数は以下で見ることができます。
    https://github.com/ncrocfer/BP-Portfolio/blob/master/includes/bp-portfolio-template.php

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • 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_postsbp_portfolio_the_itemthe_postに似ているみたいです。ただし、WordPressの have_postsにはパラメータがありませんが、 bp_portfolio_has_itemsは検索条件をパラメータにできるようです。

    これがもし本当なら、bp_portfolio_has_itemsのパラメータにソート順を指定できるかもしれません。WordPressの基本的なループだと、ソート順をランダムにするには 'orderby' => 'rand' を指定するので、これがBuddyPress Portfolioにも当てはまるかもしれません。

    トピック投稿者 ooshirotakashi

    (@ooshirotakashi)

    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_argsarray'orderby' => 'rand' を加えました。

    トピック投稿者 ooshirotakashi

    (@ooshirotakashi)

    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さん、とても勉強になりました。ありがとうございました^^

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「Buddypress Portfolioの並び順をランダムにしたい」には新たに返信することはできません。