• 解決済 an83022

    (@an83022)


    トピック名の通り、普通の投稿とカスタム投稿をまとめて日付の新しい順に10件まで表示するショートコードを作成したいと考えています。
    現在、各投稿の一覧を表示するショートコードは存在するのですが、2つの投稿を合わせて表示するショートコードが無く、一から制作しなければいけない状況です。しかし、このショートコードの中身について、私自身が全てコーディングした訳ではないため、仕組みが理解できておらず、どのようにコードを制作すれば良いかわからず、詰まってしまっています。

    各一覧を表示するコードは、
    【ニュース一覧表示(普通の投稿)】

    function show_news($attr) {
    	//初期値の設定
    	//件数:10件
    	extract(shortcode_atts(array(
    		'max' => '10'
    	), $attr));
    
    	$news .= "<dl>";
    		$posts_array = array ('post');
    		//表示数を設定
    		$news_posts = query_posts(array('numberposts' => $max, 'post_type' => $posts_array));
    		
    		foreach($news_posts as $post) {
    
    			$news .= "<dt>";
    				$news .= "<span class='newsdate' style=color:#000000;>"; 
    					$news .= mysql2date('Y年m月d日', $post->post_date);
    				$news .= "</span>";
    			$news .= $post->post_title;
    			$news .= "</dt>";
    		$news .= "<dd>";
    			$text = get_extended( $post->post_content )['main'];
    			$text = apply_filters( 'the_content', $text );
    			$text = str_replace( ']]>', ']]&gt', $text );
    			//「お知らせを詳細ページに飛ばす」が"はい"なら70文字まで表示、続きリンクへ遷移
    			if ( get_post_meta($post->ID, 'shortjump', true) == 'はい' ) {
          			$news_content = wp_strip_all_tags(strip_shortcodes($post->post_content,0,70));
          			$news .= "<div class='top_newstext'>".mb_substr($news_content,0,70)."..."."</div>";
    				$news .= "<a href=".get_the_permalink($post->ID).">続きはこちら</a>";
    			} else {
    				$news .= $text;
    			}
    		$news .= "</dd>";
    	}
    	$news .= "</dl>";
    return $news;
    }
    add_shortcode('news', 'show_news');

    【ブログ一覧表示(カスタム投稿)】

    function show_blog($attr) {
    	//初期値の設定
    	//件数:10件
    	//カテゴリ:なし
    	extract(shortcode_atts(array(
    		'max' => '10',
    		'cat' => ''
    	), $attr));
    
    	$posts_array = array('column');
    	if(get_post_type( get_the_ID() ) === 'page'){
    		$paged = max( 1, get_query_var('paged') );
    		$offset = ($paged -1) * $max;
    		// 全件数から最大ページ取得
    		$all_blog_cnt = count( get_posts(array( 'post_type' => $posts_array, 'category' => $cat, 'posts_per_page' => -1 )));
    		$max_page = ceil( $all_blog_cnt / $max );
    		// ページネーション追加
    		$big = 999999999;
    		$args = array(
    			'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    			'format' => '?paged=%#%',
    			'current' => $paged,
    			'total' => $max_page
    		);
    		$pagination = "<div class=\"pagination\">".paginate_links($args)."</div>";
    	}
    
    	// 記事取得
    	$blog_posts = get_posts(array(
    		'post_type'      => $posts_array,
    		'category'       => $cat,
    		'numberposts'    => $max,
    		'offset'         => $offset
    	));
    
    	foreach($blog_posts as $post){
    		$blog .= "<dt>";
    			$blog .= "<span class='columndate'>";
    				$blog .= "<span style=color:#000000;>".mysql2date('Y年m月d日', $post->post_date)."</span>";
    				$blog .= "<strong>"."ブログを更新しました。"."</strong><br>";
    				$blog .= "<a href=".get_the_permalink($post->ID).">".$post->post_title."</a>";
    			$blog .= "</span>";
    		$blog .= "</dt>";
    	}
    
    	if(isset($pagination)){
    		$blog .= $pagination;
    	}
    	return $blog;
    }
    add_shortcode('blog', 'show_blog');

    となっています。
    該当箇所をそのまま張り付けたため、抜けなどありましたら申し訳ございません。

    この2つをまとめて表示するショートコードを作成するには、どのように作成をすればよろしいでしょうか?ご教示頂けますと幸いです。

    • このトピックはan83022が3年、 7ヶ月前に変更しました。
13件の返信を表示中 - 1 - 13件目 (全13件中)
  • こんにちは

    query_posts() も get_posts() も投稿タイプ (post_type) を複数指定できます。

    $posts_array = array ('post');
    $posts_array = array('column');

    $posts_array = array( 'post', 'column' );

    トピック投稿者 an83022

    (@an83022)

    ご回答いただきありがとうございます。
    複数指定ができるのですね!知りませんでした。
    上記のコードを打ち込んだところ、無事に表示させることが出来ました。

    立て続けに質問をしてしまって申し訳ないのですが、こちらの表示方法を「ニュースを7件まで表示、ブログを3件まで表示」と各投稿の表示数を指定したい場合、どのような記述をすれば良いでしょうか?カウンター等の変数を追加して実装を試みたのですが、上手くできずに詰まっています。
    質問続きで申し訳ございません。こちらについてもご教示頂けますと幸いです。

    ある程度のコードを書くことになりそうです。
    ページングなしで簡単な方法であれば、
    ニュースの7件とブログの3件を個別に取得 (get_posts) して、投稿をマージ (array_merge)、日付 (post_date) でソート (usort) するとかでしょうか?

    トピック投稿者 an83022

    (@an83022)

    ご教示頂きありがとうございます!
    ご教示頂いた内容を参考に、コーディングしてみようと思います!

    最後に一つ質問なのですが、foreach文で表示処理をする中で、ニュース記事とブログ記事を表示する際に、レイアウト(表示するデータ)を各記事で変更することは可能でしょうか?
    ニュース記事の場合はタイトルと更新日を表示、ブログ記事ならば [タイトル]を更新しました。 とだけ表示
    のように、投稿ごとに表示されるデータを変更したいと考えています。
    投稿のID?(今回でいう’post’や’column’)を使ってif文で判定をすれば、実装できるのではないかと思うのですが、いまいち方法がわかりません。
    そのため、上記の件についてご教示頂けますと幸いです。
    質問ばかりになってしまい申し訳ございません。

    get_post_type() はどうでしょうか。指定した投稿または現在の投稿の、投稿タイプを取得することができます。

    if ( 'post' === get_post_type( $post ) )

    トピック投稿者 an83022

    (@an83022)

    ご回答ありがとうございます!
    返信が遅れてしまい申し訳ございません。

    こちらの質問でご教示頂いた内容を元に自分である程度実装してみました!

    $posts_array = array ('post', 'column');
    	//表示数を設定
    	$news_posts = query_posts(array('numberposts' => $max, 'post_type' => $posts_array));//$max=10
    	
    	$blogcnt = 0;//ブログの件数カウント変数
    	foreach($news_posts as $post) {
    		$news .= "<dt>";
    		
    		if ( 'post' === get_post_type( $post ) ){//news表示
    				[ニュース記事表示処理]
    		}else{//blogの時の表示
    			if($blogcnt < 3){//ブログ記事を3つまで表示
    				[ブログ記事表示処理]
    				$blogcnt++;
    			}else{//表示されたブログ記事が3つ以上なら
    				if(get_post_type === 'post'){//今ループで見ている箇所がニュース記事なら
    					[ニュース記事表示処理]
    				}else{
    					[?ブログ記事表示処理?]
    				}
    			}//blog表示ここまで
    		}//news表示ここまで
    
    		$news .= "</dt>";

    ただ、ブログ記事を既に3つ表示していて、それ以降にブログ記事が来た場合の表示方法がわからないため、表示が上手くできていません。(コードの[?ブログ記事表示処理?]の部分です)
    このforeach文の中で、「ブログ記事を飛ばしてニュース記事を表示する」ということは可能なのでしょうか?
    この機能が完成すれば、理想のサイトを制作することが出来るため、何度も質問をしてしまいお手数をおかけしますが、ご教示頂けますと幸いです。

    [?ブログ記事表示処理?]

    は、そもそもその上の if により到達しないコードになっていませんか?

    トピック投稿者 an83022

    (@an83022)

    ご返信ありがとうございます。
    見辛いコードで申し訳ございません。。
    該当箇所をこちらに変更したところ、現状.jpgのように表示されているので、恐らく到達しているものかと思います。
    if文が多すぎて処理が上手くできていないのでしょうか…?

    すみませんが、このコードだけではわかりません。
    条件分岐のみを抜粋してもらえませんか?

    やりたいことがいまいち分からないのですが、こんな感じでしょうか?

    // ブログを3件取得
    $blog_posts = get_posts( array( 'post_type' => array( 'post' ), 'posts_per_page' => 3 ) );
    
    // ニュースを7件取得
    $news_posts = get_posts( array( 'post_type' => array( 'column' ), 'posts_per_page' => 7 ) );
    
    // ブログとニュースをマージ
    $marged_posts = array_merge( $news_posts, $blog_posts );
    
    // 日付でソート
    usort( $marged_posts, function( $a, $b ) { return ( $a->post_date < $b->post_date ) ? 1 : -1; } );
    
    foreach( $marged_posts as $post ) {
    	if ( 'post' === get_post_type( $post ) ) {
    		// ブログを表示
    	} else {
    		// ニュースを表示
    	}
    }
    トピック投稿者 an83022

    (@an83022)

    御手数おかけしてすみません。。
    はい、その処理内容で間違いありません。

    foreach( $marged_posts as $post ) {
    	if ( 'post' === get_post_type( $post ) ) {
    		// ブログを表示
    		$news .= "<span class='newsdate'>";
    		$news .= mysql2date('Y年m月d日', $post->post_date);
    		$news .= "</span>";
    		$get_page_title = get_the_title(102);
    		$news .=  " "."ブログを更新しました。<br>";
    	} else {
    		// ニュースを表示
    		$news .= "<span class='newsdate'>";
    		$news .= mysql2date('Y年m月d日', $post->post_date);
    		$news .= "</span>";
    		$news .= " ".$post->post_title."<br>";
    	}
    }

    ご教示頂いたコードを入れてみたところ、上手く処理が実行されるようになりました!
    しかし、ニュース表示の箇所もブログ名が表示されてしまうようになっています。
    おそらく私のニュース表示処理の記述が間違っているのですが、、。
    ニュース(post)の記事を表示するにはどのように記述をすれば良いでしょうか?
    何度もお手数をおかけしてすみません。

    提示のコードの範囲では、そのようになるとは思えません。他に問題があるのではないでしょうか。

    トピック投稿者 an83022

    (@an83022)

    そうですね、、かなり量の多いコードの中の一部なので、その可能性が高いと思います。
    一旦自分で原因を探ってみて、また疑問点が出てきたら改めて質問させて頂きますね。
    ご回答いただきありがとうございました。

13件の返信を表示中 - 1 - 13件目 (全13件中)

トピック「複数の投稿をまとめて日付順に並べたい」には新たに返信することはできません。