• 解決済 Phullapadma

    (@phullapadma)


    開発中のサイトで、元から無限スクロール付きの有料非公式テーマを、子テーマを作ってカスタマイズしています。
    ところが、カテゴリアーカイブの幾つかで、本来そのアーカイブページの対象でない投稿を、無限スクロールでHTMLを追加する際に、たくさん読み込んでしまいます。(他にも思惑通りでない動きがありますが、それはこの質問では措いておきます)
    無限スクロールのためのクエリを生成する関数が、finctions.phpの中にあり、その中で、もしカテゴリIDがあればクエリの条件に追加することを意図した記述があるのですが、余計な投稿を読み込むカテゴリでは、値がうまく取得できていないことが分かっています。仮に具体的な数値を手動で渡してやれば、無限スクロールもそのカテゴリに絞られます。
    そこで、そのテーマで使ってある方法($_POST[‘cat’])以外で、表示中のカテゴリアーカイブのカテゴリIDをfunctions.phpから的確に読み込む方法はないでしょうか。Codexでカテゴリ周りの関数を見てもうまく探せませんでした。
    なお、一つの投稿に複数のカテゴリが割り当てられたりするため、個別の投稿(post)の情報からカテゴリを取得しようすると、的外れな値が入ることになります。また、カテゴリには親子関係を作り、URLはそのスラッグの親子関係を使っていますが、カテゴリアーカイブとしては、親は親、子は子の各々単一のカテゴリのアーカイブ表示をしたいと思っています。
    それから、その取得に適したアクションフック(wordpressのどの動きの時点か)の例も併せてご教示いただければ幸いです。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • 本来そのアーカイブページの対象でない投稿を、無限スクロールでHTMLを追加する際に、たくさん読み込んでしまいます。

    対象でないのに表示される投稿とは、どんな投稿ですか?(具体的に教えてください)

    そのテーマで使ってある方法($_POST[‘cat’])以外で、表示中のカテゴリアーカイブのカテゴリIDをfunctions.phpから的確に読み込む方法はないでしょうか。

    それよりも的確な方法はほかにないと思いますよ。Phullapadmaさんが指摘のとおり、アーカイブの先頭の投稿からカテゴリーを取得するのでは合わないのですよね。

    カテゴリアーカイブとしては、親は親、子は子の各々単一のカテゴリのアーカイブ表示をしたいと思っています。

    WP_Queryの「カテゴリーのパラメータ」説明が参考になりませんか。クエリを cat=123 にすると123の子カテゴリーも含まれますが、category__in=123 なら123だけになり子カテゴリーは含まれません。

    トピック投稿者 Phullapadma

    (@phullapadma)

    ご回答ありがとうございます。

    対象でないのに表示される投稿とは、どんな投稿ですか?(具体的に教えてください)

    カテゴリアーカイブにおいて、当該カテゴリ(及びその親子関係のカテゴリ)に属さない投稿のことです。こうしたカテゴリでは、functions.php内の、無限スクロール用のクエリを生成する関数が呼び出された際、$_POST[‘cat’]が空配列になっており、スクロールして次を読み込むためのクエリにおいて、どこのカテゴリのアーカイブであるかの絞り込みができていないのです。URLはきちんとそのカテゴリのスラッグが使われており、最初の読み込み(無限スクロールの始動前)では絞り込みが効いているにも関わらずです。
    一部のカテゴリでそうなる理由が分からず、無理やりにでもカテゴリIDを渡す他の方法がないか思案していました。
    そろそろ行き詰って、次は、$_SERVER[‘REQUEST_URI’]からスラッグを正規表現で抜き出して使えるかを試そうかと頭が迷走してきたところで質問させていただいております。

    有料非公式テーマということなのでコードを見て(見せて)どうこうすることはできませんが、$_POST['cat'] の他に $_POST に何が入っているか確かめてはどうでしょう。そこにヒントがあるかも。
     
    追記: get_query_var( 'cat' ) で取得できないでしょうか。

    少し考えてみたのですが、無限スクロール用のクエリをajaxで実行しているのではないでしょうか。そのときcatが渡されていないのかもしれませんね。

    トピック投稿者 Phullapadma

    (@phullapadma)

    鍵になっていることの一つは、そのAjaxに渡すクエリを生成している関数がフックされているアクションだと思われます。テーマを初期化してからページが一通り表示されるまでの適切な段階のアクションフックでは取得できる各種の値が、そこのアクションフック内では取得できません。一度表示されたらそこで一連のPHPの動作がいったん止まるからでしょうか。get_query_var( ‘cat’ ) も、また $_SERVER[‘REQUEST_URI’] も取得できないようです。
    アクション名は、’wp_ajax_infinite_scroll’と’wp_ajax_nopriv_infinite_scroll’(ログインユーザー用とそれ以外用)です。
    先のタイミングで取得した値をグローバルに投げてから後で取得できないかとも思ったのですが、私にはやり方がわかりません。これまでは失敗して空になっています。

    $_POST[‘cat’] の他に $_POST に何が入っているか確かめてはどうでしょう。

    そこで値のある配列のキーは、action, page_no, loop_file です。

    アーカイブページを最初に表示するときはcatの値を取得できるはずですよね。
    それをajax呼び出し側で引数に含めることができませんか。
    ajaxで呼び出されたアクションは引数からcatの値を取り出せるでしょう。

    一度表示されたらそこで一連のPHPの動作がいったん止まるからでしょうか。

    その通りです。

    トピック投稿者 Phullapadma

    (@phullapadma)

    クエリ定義関数内からJavaScriptを使ってURIを取得できないかもダメ元で試してみましたが、JavaScriptが実行されずに全体が文字列として扱われてしまって無理なようでした。
    ちなみにこのフックの中からでは、is_category()等も効きません。

    参考になるかどうかわかりませんがstackoverflowに似たトピックがありました。
    (キーワード wp_ajax_infinite_scroll で検索)

    php – Add Infinite Scroll to Ajax Loaded (WordPress) Category Query – Stack Overflow

    トピック投稿者 Phullapadma

    (@phullapadma)

    行き違い済みません。

    アーカイブページを最初に表示するときはcatの値を取得できるはずですよね。

    その通りです。

    それをajax呼び出し側で引数に含めることができませんか。

    それができればとも思っているのですが、アクション名’wp_ajax_infinite_scroll’と’wp_ajax_nopriv_infinite_scroll’にフックされているクエリを生成する関数に受け渡す方法が分かりません。異なる呼び出し位置の関数に値を受け渡す方法にはどのようなものがありますでしょうか。

    トピック投稿者 Phullapadma

    (@phullapadma)

    再び行き違い済みません。

    ご紹介のページは今から検証させていただきます。

    トピック投稿者 Phullapadma

    (@phullapadma)

    編集中のテーマ構成で、admin-ajax.phpに追加HTMLを要求するコードや、それをHTMLに追加させるコードは、footer.phpにjQueryを使用して書かれています。これが動くタイミングで、functions.phpでフックされた関数が連動し、生成したクエリを渡す形です。
    ということで、footer.php内で、取得したカテゴリIDを差し込めるならそれでもいいのですが。

    ご紹介のページでは、アクションフックの位置で $cat = $_POST[‘val’]; が取れていることが前提になっていますので、参考にならないようです。

    トピック投稿者 Phullapadma

    (@phullapadma)

    となると、functions.php のアクションフックから footer.php内に関数を移して、footer.php内で直接、クエリを適切に生成できるのかどうか、も気になりますが……。

    トピック投稿者 Phullapadma

    (@phullapadma)

    私自身の問題としてはまだ一切解決していませんが、当初の表題と相当離れた方向に焦点が移りつつあることと、テーマ開発会社側にこの問題を認識してもらえていることがようやく分かったため、解決済みにしてこのトピックを閉じます。
    gblsm様、ご対応ありがとうございました。

    トピック投稿者 Phullapadma

    (@phullapadma)

    [このスレッドを見に来た方のための追記]

    session を介すれば、functions.php内で先に取得した値を、表示終了後に呼ばれる関数に渡すことは可能です。褒められたやり方かは分かりませんが……。

    (1) session が開始していなければ開始させる処理
    (例)

    function mytheme_register_session() {
        if(!session_id()) {
            session_start();
        }
    }
    add_action('init', 'mytheme_register_session');

    (2) 必要な値を取得して $_SESSION に新設するプロパティに保存する処理
    (例)

    function get_the_archives_category() {
            if(is_category()) {
                $_SESSION['MYTHEME_CAT_ID'] = get_query_var('cat');
            }
    }
    add_action( 'the_post','get_the_archives_category');

    (3) 後から別のフックで呼び出された関数から値を取得する処理

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「表示中のカテゴリ一覧のカテゴリIDをfunctions.phpで取得するには?」には新たに返信することはできません。