• ICTBS

    (@kaibundou)


    イベントやスケジュールのホームページを制作していて行き詰まったので、ご教授よろしくお願いします。
    まず、今のhome.phpのコードです。

    <?php
    	global $post;
    	$args = array( 'numberposts' => 15,'category' => '18,19','orderby' => 'meta_value','mata_key' => '実施日 実施日1 実施日2','order' => ASC );
    	$myposts = get_posts( $args );
    	foreach( $myposts as $post ) :	setup_postdata($post); ?>
    	<li>
    	<a href="<?php the_permalink() ?>"><?php the_title(); ?></a><span class="f09em">…
    	<?php if (post_custom('実施日')) {
    		echo post_custom('実施日');
    	} elseif (post_custom('実施日1')) {
    		echo post_custom('実施日1');
    	} elseif (post_custom('実施日2')) {
    		echo post_custom('実施日2');
    	} ; ?></span>
    	<?php the_excerpt(); ?><!--プラグインのコード-->
    	</li>
    	<?php endforeach; ?>
    	<?php $post = $tmp_post; ?>

    カスタムフィールドの項目に「実施日」「実施日1」「実施日2」があり全ての投稿で入力されています。
    カテゴリ18、19に属する全ての投稿を「実施日」「実施日1」「実施日2」で日付順に昇順に並べ替えたリストを表示させようと思っています。
    しかし、上記のコードだと「実施日」「実施日1」「実施日2」でそれぞれ昇順に並んでしまします。
    半角スペース以外に「,」や「&」などでも試しましたがダメでした、どのようにすればいいのでしょうか?
    よろしくお願いします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • #未検証

    テーマフォルダの functions.php に以下を追加:

    function my_posts_join( $join, $query ) {
      global $wpdb;
      $join .= " INNER JOIN $wpdb->postmeta AS m1 ON m1.post_id = $wpdb->posts.ID AND m1.meta_key = '実施日'";
      $join .= " INNER JOIN $wpdb->postmeta AS m2 ON m2.post_id = $wpdb->posts.ID AND m2.meta_key = '実施日1'";
      $join .= " INNER JOIN $wpdb->postmeta AS m3 ON m3.post_id = $wpdb->posts.ID AND m3.meta_key = '実施日2'";
      return $join;
    }
    function my_posts_orderby( $orderby, $query ) {
      $orderby = 'm1.meta_value ASC, m2.meta_value ASC, m3.meta_value ASC';
      return $orderby;
    }

    home.php で:

    <?php
    add_filter( 'posts_join', 'my_posts_join', 10, 2 );
    add_filter( 'posts_orderby','my_posts_orderby', 10, 2 );
    $args = array(
      'numberposts' => 15,
      'category' => '18,19',
      'suppress_filters' => false,
    );
    $posts = get_posts( $args );
    foreach( $posts as $post ) :
      setup_postdata( $post );
    ?>
    〜html の出力はお好みで〜
    <?php
    endforeach;
    wp_reset_postdata();
    remove_filter( 'posts_join', 'my_posts_join', 10, 2 );
    remove_filter( 'posts_orderby','my_posts_orderby', 10, 2 );
    ?>

    な感じでいかがでしょう。

    トピック投稿者 ICTBS

    (@kaibundou)

    kzさん

    ご提案ありがとうございました。
    上記のコードで試しましたがhtmlが表示されていません。
    functions.phpでデータベースを直接触っているのはわかりますが、私の知識では修正できません。
    何か修正案でもありましたらよろしくお願いします。

    今回のご提案でfunctions.phpは一番最後にコピペで貼り付けました。
    home.phpは下記のとおりです。

    <?php
    	add_filter( 'posts_join', 'my_posts_join', 10, 2 );
    	add_filter( 'posts_orderby','my_posts_orderby', 10, 2 );
    	$args = array(
    	  'numberposts' => 15,
    	  'category' => '18,19',
    	  'suppress_filters' => false,
    	);
    	$posts = get_posts( $args );
    	foreach( $posts as $post ) :
    	  setup_postdata( $post );
    	?>
    	<li>
    	<a href="<?php the_permalink() ?>"><?php the_title(); ?></a><span class="f09em">…
    	<?php if (post_custom('実施日')) {
    		echo post_custom('実施日');
    	} elseif (post_custom('実施日1')) {
    		echo post_custom('実施日1');
    	} elseif (post_custom('実施日2')) {
    		echo post_custom('実施日2');
    	} ; ?></span>
    	<?php the_excerpt(); ?>
    	</li>
    	<?php
    	endforeach;
    	wp_reset_postdata();
    	remove_filter( 'posts_join', 'my_posts_join', 10, 2 );
    	remove_filter( 'posts_orderby','my_posts_orderby', 10, 2 );
    	?>
    	<?php $post = $tmp_post; ?>

    カスタムフィールドのキー名を’実施日’,’実施日1’などの日本語から
    ‘date0’, ‘date1’のような英数字に変更すると吉です。。

    トピック投稿者 ICTBS

    (@kaibundou)

    kzさん

    早速のご指示ありがとうございました。
    カスタムフィールドのキー名を英数字に変更してもhtmlが表示されていません。
    よろしくお願いします。

    コードは検証しましたので、カスタムフィールドのキー名が英数字なら OK なはずです。
    ・「テーマフォルダの」functions.php に my_〜 の関数を書いているか
    ・カテゴリーID 18,19 の記事があるか
    など確認してみてください。

    Debug Bar, Debug Bar Extender プラグインを入れて、「Queries」から
    当該のクエリが以下の「ように」なっているか確認してみてください。
    ※実施日–>date0, 実施日1–>date1, 実施日2–>date2 に変更しています。
    SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta AS m1 ON m1.post_id = wp_posts.ID AND m1.meta_key = 'date0' INNER JOIN wp_postmeta AS m2 ON m2.post_id = wp_posts.ID AND m2.meta_key = 'date1' INNER JOIN wp_postmeta AS m3 ON m3.post_id = wp_posts.ID AND m3.meta_key = 'date2' WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (18,19) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') GROUP BY wp_posts.ID ORDER BY m1.meta_value ASC, m2.meta_value ASC, m3.meta_value ASC LIMIT 0, 15

    トピック投稿者 ICTBS

    (@kaibundou)

    kzさん

    お忙しい中、本当にありがとうございます。
    ご指示の通り、カスタムフィールドのkeyを実施日–>date0, 実施日1–>date1, 実施日2–>date2 に変更しました。
    fanctions.phpもkeyに合わせて下記のように変更しました。

    function my_posts_join( $join, $query ) {
      global $wpdb;
      $join .= " INNER JOIN $wpdb->postmeta AS m1 ON m1.post_id = $wpdb->posts.ID AND m1.meta_key = 'date0'";
      $join .= " INNER JOIN $wpdb->postmeta AS m2 ON m2.post_id = $wpdb->posts.ID AND m2.meta_key = 'date1'";
      $join .= " INNER JOIN $wpdb->postmeta AS m3 ON m3.post_id = $wpdb->posts.ID AND m3.meta_key = 'date2'";
      return $join;
    }
    function my_posts_orderby( $orderby, $query ) {
      $orderby = 'm1.meta_value ASC, m2.meta_value ASC, m3.meta_value ASC';
      return $orderby;
    }

    そして、home.phpも下記のように変更しました。

    <ul class="news-top">
    	<?php
    	global $post;
    	add_filter( 'posts_join', 'my_posts_join', 10, 2 );
    	add_filter( 'posts_orderby','my_posts_orderby', 10, 2 );
    	$args = array(
    	  'numberposts' => 15,
    	  'category' => '18,19',
    	  'suppress_filters' => false,
    	);
    	$posts = get_posts( $args );
    	foreach( $posts as $post ) :
    	  setup_postdata( $post );
    	?>
    	<li>
    	<a href="<?php the_permalink() ?>"><?php the_title(); ?></a><span class="f09em">…
    	<?php if (post_custom('date0')) {
    		echo post_custom('date0');
    	} elseif (post_custom('date1')) {
    		echo post_custom('date1');
    	} elseif (post_custom('date2')) {
    		echo post_custom('date2');
    	} ; ?></span>
    	<?php the_excerpt(); ?>
    	</li>
    	<?php
    	endforeach;
    	wp_reset_postdata();
    	remove_filter( 'posts_join', 'my_posts_join', 10, 2 );
    	remove_filter( 'posts_orderby','my_posts_orderby', 10, 2 );
    	?>
    </ul>

    Debug Bar,Debug Bar Extenderのプラグインを入れて確認したところ、Queriesにご指摘の記述がありました。
    あとはどのようにすればいいのでしょうか?

    $posts = get_posts( $args ); の後に
    var_dump( $posts ); を入れてみて
    Homeページに array(0) { } と表示されるなら、該当する記事がないということです。
    いやいやちゃんと記事ありますし、ということならココではこれ以上はムズイので
    wpxtreme.jp から直接お問い合わせください。

    >all 結果はこちらで報告しますー

    トピック投稿者 ICTBS

    (@kaibundou)

    kz様

    いつも本当にありがとうございます。
    記事はちゃんとあります、並べ替えの方法で悩んでおりました。
    上記のサイトで問い合わせてみます。
    ありがとうございました。

    しかし、kz様のご指示のようにvar_dump( $posts );を追加したらarray(0) { }が表示されています。
    カテゴリ18,19には記事があるのに、どうしたものでしょう(^_^;)

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「ソートの条件を複数設定する」には新たに返信することはできません。