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

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

ただいまの
回答率

89.52%

WordPressで、WP_Queryはどこに書くのでしょうか。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 837

tokyodesk

score 52

コード内容
//子テーマ用関数

//子テーマ用のビジュアルエディタースタイルを適用
add_editor_style();

//以下に子テーマ用の関数を書く
$args = array(
    'post_type' => 'post', //条件を設定
);
$wp_query = new WP_Query($args); //条件を入れてサブループを作成
$get_num = $wp_query->post_count; //データの中から記事の総数を取得
$all_num = $wp_query->found_posts; //データの中から今表示する記事数を取得
echo '全'.$all_num.'件中、'.$get_num.'件を表示'; //用意したデータを表示


functions.phpに書いたところ、以下のような警告になりました。

エラー内容
Warning: Cannot modify header information - headers already sent by (output started at /home/nishimachilife/nishimachilife.webcrow.jp/public_html/wp-content/themes/cocoon-child-master/functions.php:16) in /home/nishimachilife/nishimachilife.webcrow.jp/public_html/wp-includes/pluggable.php on line 1219

一般的にはWP_Queryは子テーマ内のどこに書くのでしょうか。

【追記】
ありがとうございます。
functions.phpの読み込みが順序的に早すぎたということだと思ったのですが、どのPHPファイルよりも後に画面出力の処理が読まれるようにしたら大丈夫でしょうか。
テンプレートファイルでしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

エラーの根拠は下記です。

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。

つまり、今回のエラーはWP_Query()自体ではなくecho部分で起きたエラーと思われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/19 06:42

    ありがとうございます。
    header()の処理の後に書く必要があったんですね。
    追記にも記載したいのですが、具体的にはどのPHPファイルより後に読まれるように書けば無事に出力されるのでしょうか。

    キャンセル

  • 2018/12/19 09:09

    functions.phpはそもそも本流の画面出力部分で使うための機能を定義する場所という認識です。
    (function はPHPでも関数を定義する宣言ですね)
    つまり機能を定義することはあっても基本的に画面出力の処理(echo,printなど)は書かないようにするのはまず前提です。
    ただし、「画面で出力するための文字列」を用意するのはありかと思いますので、functions.phpで任意の関数を定義しておき、
    あとはテンプレート内の出力したい場所にその関数を呼び出すようにしてはいかがでしょうか。
    「WordPress 独自関数」や「WordPress ユーザー定義関数」で調べれば公式の記事含めて沢山出てくるのでご自身の要件に合った情報を試してみてください。

    キャンセル

  • 2018/12/27 18:01

    functions.phpは定義場所であって実行場所ではなく、実行の際はテンプレートから呼び出すということですね。
    了解です。
    そのようにしてみたいと思います。

    キャンセル

+4

何をしたいかによります。

固定ページなら、page.php
アーカイブであれば、archive.php
カテゴリーアーカイブなら、category.php

など利用したい内容により変わります。

テンプレート階層 参照


(追記)

エラーメッセージ見落としていた...

WordPress の functions.php は、基本的に function (関数)を定義して、各フックやテンプレートファイルから呼び出す目的で使われることが多く、その場で実行されるコードは、あまり書きません。

WordPress は、functions.php を読み込んで、WordPress の初期化処理を実行してから、テンプレートファイルの HTTP ヘッダを出力するようになっていますので、functions.php の中で、直接画面出力を行うと今回のようなエラーになります。

共通する関数等で WP_Query を functions.php に記載するのであれば、関数として記載します。

function my_wp_query_count164353(){
{
    $args = array(
        'post_type' => 'post', //条件を設定
    );
     $wp_query = new WP_Query($args); //条件を入れてサブループを作成
     $get_num = $wp_query->post_count; //データの中から記事の総数を取得
     $all_num = $wp_query->found_posts; //データの中から今表示する記事数を取得
     echo '全'.$all_num.'件中、'.$get_num.'件を表示'; //用意したデータを表示
}

そして、定義した関数を呼び出す場合は、テーマファイルの表示したい場所に 

<?php my_wp_query_count164353(); ?>


のように記載します。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/19 06:44

    ありがとうございます。
    質問内容とは直接関係ないところなのですが、”テンプレートファイルのHTTPヘッダ”とは、category.phpなどのテンプレートファイルの中のHTMLやPHPの記述(<?php〜)の部分のことでしょうか。
    HTTPヘッダを調べるとhttpで通信する時にやりとりをする情報のようですがよくわかりませんでした。

    キャンセル

  • 2018/12/19 10:42

    あ、書き方が悪いですね。あとで修正します。
    どうやって説明するのがわかりやすいかなぁ...

    キャンセル

  • 2018/12/27 18:03

    こちらこそ要領を得ていなくてすみません。
    お時間に余裕のある時で構いませんのでどうぞよろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる