本来そのアーカイブページの対象でない投稿を、無限スクロールでHTMLを追加する際に、たくさん読み込んでしまいます。
対象でないのに表示される投稿とは、どんな投稿ですか?(具体的に教えてください)
そのテーマで使ってある方法($_POST[‘cat’])以外で、表示中のカテゴリアーカイブのカテゴリIDをfunctions.phpから的確に読み込む方法はないでしょうか。
それよりも的確な方法はほかにないと思いますよ。Phullapadmaさんが指摘のとおり、アーカイブの先頭の投稿からカテゴリーを取得するのでは合わないのですよね。
カテゴリアーカイブとしては、親は親、子は子の各々単一のカテゴリのアーカイブ表示をしたいと思っています。
WP_Queryの「カテゴリーのパラメータ」説明が参考になりませんか。クエリを cat=123
にすると123の子カテゴリーも含まれますが、category__in=123
なら123だけになり子カテゴリーは含まれません。
ご回答ありがとうございます。
対象でないのに表示される投稿とは、どんな投稿ですか?(具体的に教えてください)
カテゴリアーカイブにおいて、当該カテゴリ(及びその親子関係のカテゴリ)に属さない投稿のことです。こうしたカテゴリでは、functions.php内の、無限スクロール用のクエリを生成する関数が呼び出された際、$_POST[‘cat’]が空配列になっており、スクロールして次を読み込むためのクエリにおいて、どこのカテゴリのアーカイブであるかの絞り込みができていないのです。URLはきちんとそのカテゴリのスラッグが使われており、最初の読み込み(無限スクロールの始動前)では絞り込みが効いているにも関わらずです。
一部のカテゴリでそうなる理由が分からず、無理やりにでもカテゴリIDを渡す他の方法がないか思案していました。
そろそろ行き詰って、次は、$_SERVER[‘REQUEST_URI’]からスラッグを正規表現で抜き出して使えるかを試そうかと頭が迷走してきたところで質問させていただいております。
有料非公式テーマということなのでコードを見て(見せて)どうこうすることはできませんが、$_POST['cat']
の他に $_POST
に何が入っているか確かめてはどうでしょう。そこにヒントがあるかも。
追記: get_query_var( 'cat' )
で取得できないでしょうか。
少し考えてみたのですが、無限スクロール用のクエリをajaxで実行しているのではないでしょうか。そのときcatが渡されていないのかもしれませんね。
鍵になっていることの一つは、その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の動作がいったん止まるからでしょうか。
その通りです。
クエリ定義関数内からJavaScriptを使ってURIを取得できないかもダメ元で試してみましたが、JavaScriptが実行されずに全体が文字列として扱われてしまって無理なようでした。
ちなみにこのフックの中からでは、is_category()等も効きません。
行き違い済みません。
アーカイブページを最初に表示するときはcatの値を取得できるはずですよね。
その通りです。
それをajax呼び出し側で引数に含めることができませんか。
それができればとも思っているのですが、アクション名’wp_ajax_infinite_scroll’と’wp_ajax_nopriv_infinite_scroll’にフックされているクエリを生成する関数に受け渡す方法が分かりません。異なる呼び出し位置の関数に値を受け渡す方法にはどのようなものがありますでしょうか。
編集中のテーマ構成で、admin-ajax.phpに追加HTMLを要求するコードや、それをHTMLに追加させるコードは、footer.phpにjQueryを使用して書かれています。これが動くタイミングで、functions.phpでフックされた関数が連動し、生成したクエリを渡す形です。
ということで、footer.php内で、取得したカテゴリIDを差し込めるならそれでもいいのですが。
ご紹介のページでは、アクションフックの位置で $cat = $_POST[‘val’]; が取れていることが前提になっていますので、参考にならないようです。
となると、functions.php のアクションフックから footer.php内に関数を移して、footer.php内で直接、クエリを適切に生成できるのかどうか、も気になりますが……。
私自身の問題としてはまだ一切解決していませんが、当初の表題と相当離れた方向に焦点が移りつつあることと、テーマ開発会社側にこの問題を認識してもらえていることがようやく分かったため、解決済みにしてこのトピックを閉じます。
gblsm様、ご対応ありがとうございました。
[このスレッドを見に来た方のための追記]
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) 後から別のフックで呼び出された関数から値を取得する処理