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

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

ただいまの
回答率

88.21%

WordPressでアーカイブが取得できなくなりました

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 654

nichino

score 13

 前提・実現したいこと

お世話になります。

Wordpressでニュースページを作成し、年ごとのアーカイブを設定しています。
設定自体は2年ほど前にしていて当時は問題なく動いていたのですが、気付いたら動かなくなっていました。
プラグインは使用していません。

今年5月にサーバのシステムが更新されたのかログインが出来なくなったことがあり、アカウントを登録し直してもらいました。
また、7月にドメインのhttpsへの移行がありました。

ただ、動かないと気付いたのが4日ほど前のため、関係があるかは分かりません。
知識が足りず設定のどこが間違っているか分からない状態のため、お力お貸しいただければと思います。

 発生している問題・エラーメッセージ

アーカイブの年をクリックしても各年一覧に飛ばず最新からの一覧が表示されます。
例えば2017や2016をクリックしても、最新から10件までが表示されます。(10件表示設定のため)
次ページへのリンクは表示されますが、クリックしても最新から10件までで変わりません。

 該当のソースコード

管理画面のパーマリンク
https://example.jp/news/%year%/%monthnum%/%day%/%post_id%.html

生成される各記事のURL
https://example.jp/news/2018/09/10/276.html

sidebar.phpに
<?php wp_get_archives('type=yearly'); ?>
でアーカイブを設定しhtml上は各リンクが以下のように表示されます。
<ul>
<li><a href='https://example.jp/news/2018'>2018</a></li>
<li><a href='https://example.jp/news/2017'>2017</a></li>
<li><a href='https://example.jp/news/2016'>2016</a></li>
</ul>

エラーログを確認したところ以下のエラーが出ていました。
PHP Warning:  Missing argument 1 for query_posts(), called in /opt2/web/example.jp/htdocs/news/wp-content/themes/example/archive.php on line 24 and defined in /opt2/web/example.jp/htdocs/news/wp-includes/query.php on line 96

それぞれのファイルの該当箇所が以下になっていましたので、こちらのquery_posts();の書き方に問題があるのでしょうか。
archive.php
<?php query_posts(); ?>

query.php
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}

 試したこと

http→httpsへのリンクを確認修正しました。

 補足情報(FW/ツールのバージョンなど)

WordPress 4.9.8

ログインされているプラグイン
・Disable Emojis (GDPR friendly)
・Disable REST API
・Disable XML-RPC
・Google Captcha (reCAPTCHA) by BestWebSoft
・Login rebuilder
・Really Simple SSL
・WP Mail SMTP
※勝手に停止が出来ません

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • nichino

    2018/12/03 17:54

    テーマはarchive.phpも含め全ページ1から作成しました。

    キャンセル

  • CHERRY

    2018/12/04 11:32

    エラーログとデバッグモードで表示される内容はほぼ同じなので、エラーログが確認できるのであれば、デバッグモードは見なくても大丈夫です。

    キャンセル

  • nichino

    2018/12/04 11:36

    ありがとうございます。いただいたご回答を基に修正を試してみます。

    キャンセル

回答 1

checkベストアンサー

+1

質問文に記載された内容から分かる範囲で...

PHP Warning:  Missing argument 1 for query_posts() は、query_posts() を呼び出す時の引数の数が、定義された内容と異なっているよというメッセージですね。

query_posts は、1つの引数が必要ですが、質問文に書かれたコードの

archive.php
<?php query_posts(); ?>

では、 引数を渡していないのが 原因ですね。
ただし、Warning は、致命的なエラーではないので、(希望とは異なりますが、デフォルトの条件で)検索するという動作はしていると思います。


どのような検索がされているかというと....

query_posts() を引数なしで呼び出すと WordPress のデフォルトの検索条件が設定されて検索されます。

管理画面の設定によりますが、WordPress インストール直後のデフォルトの条件は、 最新の投稿10件を新しい順に表示 になっていると思いますので、管理画面で件数などを変更してない場合は、この状態だと思います。

---- 

テーマファイルの PHP コードをどこかの段階で書き換えていなければ、おそらく製作された直後からこの状態だったのではないかと思われます。


なお、https://wpdocs.osdn.jp/テンプレートタグ/query_posts に

注 1: この関数はプラグインまたはテーマの中で使われることを想定されていません。後ほど出てくる説明にあるように、メインクエリーを変更するにはパフォーマンス面でも優れたより良いオプションが存在します。
 
注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。モダンな WordPress コードではもっと安定したメソッドを使うべきです。例えばpre_get_posts フックを使った方法などです。ひとことで言うと、query_posts() は決して使うべきではありません。

と書かれているように query_posts をテンプレート内で使用することは、非推奨とされていますので、WP_Query か pre_get_posts あたりで、書き換えるのが良いと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/04 13:42

    ありがとうございます、大変参考になります。
    こちらを基にpre_get_postsに書き換えたところエラーが出なくなりました。
    また、アーカイブも表示出来るようになりました。

    archive.phpで
    <h3><?php printf( __('年別: %s'), '<span>' . get_the_date( _x( 'Y', 'yearly archives date format') ) . '</span>' ); ?></h3>
    と年を表示するようにしていて、2017や2016のリンクをクリックしても2018と出てしまうのですが、過去データは拾えるようになりました。
    年別表示は必須では無いので、取りあえず外してしまおうかと思います。

    ご助力いただき助かりました。
    ありがとうございました。

    キャンセル

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

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

同じタグがついた質問を見る