質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1648閲覧

query_postsからWP_Queryへの書き換えについて

akitasoran

総合スコア20

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/11/06 05:12

編集2021/11/06 07:44

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?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2021/11/06 06:09

WP_Query で、どのように書き換えたのかも記載していただけないでしょうか?
akitasoran

2021/11/06 07:47

返信ありがとうございます。 WP_Queryで調べたところ指定するパラメータがquery_postsと同じもので使えそうだったので、関数名だけの書き換えとなります。
guest

回答3

0

解決済みとのことですが。

こういったメインループとは異なるポストを取得するのは get_posts() を使うのが推奨だったかと思います。

get_posts() で取得した投稿を処理した後、 wp_reset_postdata() とすることでメインループに戻す、といった動作ができます。

投稿2021/11/10 15:07

編集2021/11/10 15:08
kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答に頂いたプログラムを実行してみても結果は変わらずHello World!がいくつも出力されるだけでした。

var_dumpで出力されたのかSQLを元に色々試してみたところ、以下のプログラムで関連記事の取得ができました。

回答して頂いたのに申し訳ありませんでした。

PHP

1<?php 2/* 3 Template Name: 関連記事 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$tag = implode(",", $array); 15 16$sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM wp_posts INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id WHERE wp_posts.ID != ' . get_the_ID() . ' AND wp_term_relationships.term_taxonomy_id IN (' . $tag . ') AND wp_posts.post_status = "publish" GROUP BY wp_posts.ID ORDER BY count(post_title) DESC;'; 17 18global $wpdb; 19$query = $wpdb -> get_results($sql, ARRAY_A); 20 21if(count($query)){ 22 echo '<h3>関連記事</h3>'; 23 echo '<dl>'; 24 foreach($query as $row){ 25 $link = get_permalink($row["ID"]); 26 echo '<dt><a href="' . $link. '">' . $row['post_title'] . '</a></dt>'; 27 echo '<dd>' . get_post_meta($row["ID"], "description", true) . '</dd>'; 28 } 29 echo '</dl>'; 30} 31?>

投稿2021/11/10 14:59

akitasoran

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

WP_Queryで調べたところ指定するパラメータがquery_postsと同じもので使えそうだったので、関数名だけの書き換えとなります。

なるほど...

query_posts は、テンプレートタグ/query_posts

注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。

とあるように「メインクエリを書き換えています」($post 等が上書きされていました)ので、質問のコードで動いていましたが、WP_Query は、メインクエリを書き換えないので、$post が更新されないので、投稿の数だけ同じ内容の行が複数行表示されます。

関数リファレンス/WP_Query の「使い方」にあるように

<?php // The Query $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_the_title() . '</li>'; } echo '</ul>'; /* Restore original Post Data */ wp_reset_postdata(); } else { // no posts found }

のような感じで、 ループの中で、$the_query->the_post(); を利用して、$post を上書きして処理してループを抜けてから wp_reset_postdata(); で、$post をメインクエリに戻します。

また、foreach を使うのであれば、 テンプレートタグ/get_postsの「用例」のように

foreach ( $myposts as $post ) : setup_postdata( $post ); ?> <li> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </li> <?php endforeach; wp_reset_postdata();?>

ループ内で、setup_postdata( $post ); で、ループのデータで $post を設定して、 ループを抜けてから wp_reset_postdata(); で、$post をメインクエリに戻しておくように記載します。

投稿2021/11/06 13:55

CHERRY

総合スコア25218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問