2

私はプラグインに取り組んでおり、いくつかの迅速で汚い開発のために、現在の投稿に関するデータをデータベースに格納するプラグインの関数を呼び出す関数呼び出しをsingle.phpに追加しました。

ただし、常に2回呼び出されることに気付きました。1回はリクエストしている投稿用で、もう1回は別の投稿用です(ページのコンテンツには表示されません)。

これがなぜであるか、もしそうなら、それが望ましい振る舞いであるかどうか、そしてそうでない場合はどうすれば修正できるかを誰かが知っていますか?

これが私のsingle.phpに似た例です:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                   <?php do_action('msw_single_php', $wp_query);  ?>

そして私のプラグインファイルに似たもの:

add_action('msw_single_php', 'msw_sp', 0, 1);
function msw_sp(WP_Query $query) {
    global $wpdb;
    $wpdb->insert($wpdb->prefix . 'msw_career_view_debug', array(
        'request_info'      => json_encode($query),
    ));
}
4

2 に答える 2

10

私は同じ問題に遭遇しましたが、今は解決しました。

私にとって、この問題は、single.php が呼び出されたときに Firefox でのみ発生しました。そして、あなたが欲しくないポストは隣のポストでした。

それから私はたくさん検索し、最終的にここで解決策を見つけました:

http://shinephp.com/single-php-called-twice-how-to-stop/

これは別の参照を提供します:

http://wordpress.org/support/topic/singlephp-called-for-current-and-next-post-with-pretty-permalinks

上記のリンクに感謝します。

ここで簡単に説明したいと思います:

その理由は、Firefox のプリフェッチ機能にあります。single.php の場合、WP は <header> に 2 つの <link> を自動的に配置し、そのうちの 1 つは次の投稿 (隣接する投稿) を指すrel="next"です。

Firefox がこれを認識すると、現在の投稿を読んだ後に次の投稿に移動する場合に備えて速度を上げるために、<link> が指すページをプリフェッチします。したがって、その投稿は呼び出されますが、表示されることはありません。これが、バックトレースでさえも、デバッグのためにダンプしたメッセージが表示されない理由でもあります。

ところで、2 つの <link> を追加するアクションは「default-filters.php」に追加されています。WP 3.5.1 の場合は #204 行にあります。

解決策は次のとおりです。

以下を実行する関数 (たとえば、"remove_adjacent_links") を記述します。

remove_action(‘wp_head’, ‘adjacent_posts_rel_link_wp_head’)

関数(remove_adjacent_links)を「init」にフックします。

このようにして、リンクが から削除されます。

ただし、リンクを表示したい場合は、このままにして Firefox のプリフェッチを許容する必要があるかもしれません。そこを離れてWPコードを使用してFirefoxのプリフェッチを停止する方法があるかどうかは試していません。

于 2013-05-17T02:45:38.583 に答える
1

自分でデバッグを開始することをお勧めしますWP_DEBUG。どの投稿が通過するか、ページのどこにあるかを確認します
var_dump($query)。 また、それが単一のページであるかどうかを確認する ことをお勧めします。それがページ構築クエリか追加クエリかがわかります。msw_sp()
var_dump(is_single())
var_dump($query->is_main_query())

2 番目の投稿はサイドバーのどこかにありますか?

本当の答えではありませんが、始めるための方法です。

于 2012-08-06T07:37:13.153 に答える