WordPressで関連記事を出力するプログラムを書いているのですが、query_postsを使って書いたところquery_posts以降のデザインが崩れてしまいました。
related.phpというPHPファイルを作り、page.phpで呼び出した場所に関連記事を表示するようにしています。
PHP
1<?php 2/* 3 ファイル名:page.php 4*/ 5?> 6<?php the_content() ?> 7<?php get_template_part( 'related' ); ?> 8<?php get_sidebar() ?>
よく調べたところquery_postsは非推奨でWP_Queryで書くことを推奨していたので、パラメータは同じまま「query_posts」を「new WP_Query」に書き換えたところエラーは出ませんでしたが結果が変わってしまいました。
PHP
1<?php 2/* 3 ファイル名:related.php 4*/ 5?> 6<?php 7$tags = wp_get_post_tags($post->ID); 8$array = array(); 9 10foreach($tags as $tag){ 11 array_push($array, $tag->term_id); 12} 13 14$posts = query_posts( // ←query_postsをnew WP_Queryに書き換え 15 array( 16 'tax_query' => array( 17 array( 18 'taxonomy' => 'post_tag', 19 'terms' => $array, 20 'include_children' => true, 21 'field' => 'term_id', 22 'operator' => 'IN' 23 ), 24 'relation' => 'AND' 25 ) 26 ) 27); 28?> 29 30<h3>関連記事</h3> 31<div id="related"> 32<dl> 33 <?php 34 if(count($posts)){ 35 foreach($posts as $post){ 36 $id = $post -> ID; 37 ?> 38 <?php 39 the_title( '<dt><a href="' . esc_url( get_permalink() ) . '">', '</a></dt>' ); 40 ?> 41 <dd> 42 <?php 43 echo get_post_meta($id, 'description', true); 44 ?> 45 </dd> 46 <?php 47 } 48 ?> 49 <?php 50 }else{ 51 echo "関連記事はありません。"; 52 } 53 ?> 54</dl> 55</div>
query_postsでは結果が取得できていたのですが、WP_Queryで書き換えると以下のように何の条件で出力されたのかわからない結果となりました。
HTML
1<dl> 2<dt><a href="http://uwsc.s1007.xrea.com/?p=1">Hello world!</a></dt> 3<dd></dd> 4<dt><a href="http://uwsc.s1007.xrea.com/?p=1">Hello world!</a></dt> 5<dd></dd> 6<dt><a href="http://uwsc.s1007.xrea.com/?p=1">Hello world!</a></dt> 7<dd></dd> 8<dt><a href="http://uwsc.s1007.xrea.com/?p=1">Hello world!</a></dt> 9<dd></dd> 10</dl>
WP_Queryの使い方をまとめたサイトで見つけたプログラムなど実行してみても「このサイトで重大なエラーが発生しました。」と表示されてしまいます。
WP_Queryの戻り値から生成されたSQLを実行すると0件でヒットしませんでした。
PHP
1var_dump($posts);
SQL
1SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( 2 wp_term_relationships.term_taxonomy_id IN (41,42,43) 3) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
回答よろしくお願い致します。
-----▼追加分-----
以下はWP_Queryで書いたときのプログラムです。
PHP
1<?php 2$tags = wp_get_post_tags($post->ID); 3$array = array(); 4 5foreach($tags as $tag){ 6 array_push($array, $tag->term_id); 7} 8 9$posts = new WP_Query( 10 array( 11 'tax_query' => array( 12 array( 13 'taxonomy' => 'post_tag', 14 'terms' => $array, 15 'include_children' => true, 16 'field' => 'term_id', 17 'operator' => 'IN' 18 ), 19 'relation' => 'AND' 20 ) 21 ) 22); 23?>
回答3件
あなたの回答
tips
プレビュー