カスタム分類アーカイブでページネーションを修正します
-
16-10-2019 - |
質問
私は自分のサイトのシリーズに投稿を書く方法を設定しようとしています。アイデアは、各投稿がカスタム分類法で異なるシリーズに属することができるということです。私はほぼすべてのものを手に入れました... 1つの例外を除いて。
分類法の登録
この部分は機能しています。次のコードをプラグインにドロップしました。
function jdm_build_series_taxonomy() {
$labels = array(
'name' => _x('Series Labels', 'taxonomy general name'),
'singular_name' => _x('Series Label', 'taxonomy singular name'),
'search_items' => __('Search Series Labels'),
'popular_items' => __('Popular Series Labels'),
'all_items' => __('All Series Labels'),
'parent_item' => __('Parent Series Label'),
'parent_item_colon' => __('Parent Series Label:'),
'edit_item' => __('Edit Series Label'),
'update_item' => __('Update Series Label'),
'add_new_item' => __('Add New Series Label'),
'new_item_name' => __('New Series Label Name')
);
register_taxonomy(
'series',
'post',
array(
'hierarchical' => true,
'label' => __('Series'),
'labels' => $labels,
'query_var' => true,
'rewrite' => true
)
);
}
add_action( 'init', 'jdm_build_series_taxonomy', 0 );
これにより、投稿ドロップダウンメニューに「シリーズラベル」が追加され、投稿編集画面に「シリーズラベル」ボックスが表示されます。すべてが機能しており、シリーズの一部として投稿を完全にマークできます。問題は次のセクションにあります...
分類項目のリスト
私の目標は、読者が最古の投稿から始めて時系列に前進することで、一度にシリーズの1つの投稿を歩くことを許可することです。これは、アーカイブにページごとに10個の投稿があるため、一般的なアーカイブページとは異なりますが、明らかに欲しい ページごとに1つの投稿のみ 私のシリーズアーカイブ用。
私は作成しました taxonomy-series.php
テンプレート内にファイルします。そしてそれ 半分 作品。最初のページは正常に機能します - http://localhost/wp/series/my-test-series/
シリーズの最初の記事には、ページの下部にある「次のエントリ」リンクが記載されています。ここまでは順調ですね ...
ただし、「次のエントリ»」をクリックして次のページに移動すると(http://localhost/wp/series/my-test-series/page/2/
)それはa)間違った記事とb)間違ったテンプレートです!
ただし、「ブログページが最大で表示されている」を設定すると、読み取りページ(通常は10に設定されています)で「1」から「1」を設定すると、物事は正常に機能します。 2ページには2番目の記事が表示され、3番目の記事には3番目の記事が表示されます。
それで...各ページに1つの投稿のみを表示するように分類アーカイブページを強制するために再確認する必要がありますか?以下を試しました:
$new_query = wp_parse_args(
$query_string,
array(
'posts_per_page' => 1,
'paged' => $paged
)
);
query_posts($new_query);
と
query_posts($query_string.'&posts_per_page=1&paged='.$paged);
役に立たない...アイデア?チップ?提案?
解決
やあ @eamann:
WordPressの最も不可能な側面であるため、URLシステムは私の意見では、WordPressでURLを使用してクリエイティブなことをする必要があるときはいつでも泣きます。私はいつもWordPressと戦わなければならないように感じます。WordPressはURLに関連して積極的に私と戦っています。だからそのオープナーで...
あなたの問題を考えると、私はあなたが求めていたものではない提案をするつもりです。あなたが探しているものであることがわからないなら、それは大丈夫です。
分類法は単一の増分ではなく、メタもありません
あなたがやろうとしていることの問題の1つは 分類システムは、単一の増分順序ではありません そしてそれ メタがありません. 。たとえば、3つの投稿シリーズでは、条件を見つける可能性があります ID
のs 373
, 411
と 492
;あなたはそれを理解することができます 373 = #1
, 411 = #2
と 492 = #3
しかし、それはすべて偶然であり、お互いに関連しています。 WordPressサイトのルートをプラグインコードに配置しようとするようなものですが、コードが保存されるレベルの数がわかりません。もちろん、コードを作成してそれをすべて把握してマッピングすることはできますが、それは難しくなり、別のアプローチを使用する代わりにそれを理解しようとすることから多くの価値が得られるかどうかはわかりません。
ページ番号を明示的に割り当てます
だから私が最初に提案することはそれです 君 明示的に割り当てます あなたの ページ番号 シリーズの各投稿について ポストメタ/カスタムフィールドを使用して(用語を選択しました installment
それ以外の page
それは私にとってより理にかなっているからですが、明らかにあなたはあなたのユースケースに適合するあらゆる用語を使用できるからです。)
ページ/分割払い番号の割り当ては、あなたが完全に制御されているという利点があり、そのようにして、何が強打から出たときに修正するかを知ることができます。カスタムフィールド名の編集メタボックスがあると思います _installment
分割払い番号を選択するために(そして、ページが同期しないようにクリエイティブになりたい場合は、Ajaxを介して分割払い番号を管理/ジャグリングすることもできます。)
使用する $wp_rewrite->add_rule()
URLを明示的に割り当てます
私はあなたが一般的に狂ったワードプレス・スキルツを持っていることを知っているので、私は深く行きませんので、私はそれを指摘するだけです $wp_rewrite->add_rule()
これをすべて機能させるというクルーズです。他のすべては、その関数の結果に関するサポートを提供するだけです。使用 init
フックURLルールを割り当てます:
<?php
add_action('init', 'add_series_installment_url');
function add_series_installment_url() {
global $wp,$wp_rewrite;
$wp->add_query_var('series');
$wp->add_query_var('installment');
$wp_rewrite->add_rule('series/([^/]+)/(installment-\d+)','index.php?series=$matches[1]&installment=$matches[2]','top');
$wp_rewrite->flush_rules(false); // This should really be done in a plugin activation
}
使用する parse_query
URLをquery varsに翻訳するためのフック
このソリューションの2番目の半分は、を使用します parse_query
私があなたがよく知っていることを私が知っているフック。一般に、キャプチャします query_vars
で定義されています init
URLルールを介してキャプチャされ、WordPressの投稿をクエリするために必要なものに変換します taxonomy
+term
あなたの取り扱い series
と meta_key
+meta_value
明示的に割り当てられた分割払い/ページを処理する:
<?php
add_action('parse_query', 'apply_series_installment_to_query');
function apply_series_installment_to_query(&$query) {
if (isset($query->query['series']) && isset($query->query['installment']) &&
preg_match('#^installment-(\d+)$#',$query->query['installment'],$match)) {
$query->query_vars['post_type'] = 'post';
$query->query_vars['taxonomy'] = 'series';
$query->query_vars['term'] = $query->query['series'];
$query->query_vars['meta_key'] = '_installment';
$query->query_vars['meta_value'] = $match[1];
unset($query->query_vars['series']); // You don't need this
unset($query->query_vars['installment']); // or this
unset($query->query_vars['name']); // or this
}
}
概要
通常、私は答えを説明してより深く深く入りましたが、それは遅れています、私は過去48時間で眠りが少なすぎました、そして最も重要なことはあなたがそれを理解できることを知っています。
ですから、このソリューションが気に入っていただければ幸いです。 2つの部分がない場合でも init
と parse_query
そしてその $wp_rewrite->add_rule()
そしてその $query->query_vars[]
元のアーキテクチャに固執したい場合でも、それぞれ必要なものです。幸運を祈ります。オンラインで行ったときにそれを見るのを楽しみにしています!
とにかく、これが役立つことを願っています。
他のヒント
カテゴリとタグのアーカイブページの投稿の数を変更するために使用するコードは次のとおりです。
query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );
カスタム分類法でこの作業を行うことができない場合は、ネイティブ(カテゴリ、タグ)を使用して、問題がコード自体にあるかどうかを確認して、分類法または他の何かを完全に確認してください。
また、あなたがこれを逃したのか、除外したのかはわかりませんが、$ Pagedはグローバル変数ではありません。 get_query_var( 'paged')としてフェッチする必要があります
私がこれについて問題に直面し、髪を引っ張ることでHRSをHRSに合格したら。私はグーグルで検索しましたが、トピックに関する具体的な解決策は見つかりませんでした。私はいくつかの才能の記事を見つけましたが、彼らは私の問題を満たしていませんでした。実際、カスタム分類法アーカイブページページネーションは、関連する機能の引数のいくつかの設定に依存します。ですから、私は実際にここで、分類アーカイブページネーションの問題を解決するという私の考えを共有しています。
カスタム分類法アーカイブページのページネーションに必要な5つのことが完全に機能します。
(1)入れないでください exclude_from_search
パラメーターキーAS register_post_type
引数パラメーターまたは設定 'exclude_from_search' => false
. 。デフォルトでは設定されています false
.
(2)カスタムポストタイプセットで使用される分類法 'taxonomies' => 'custom_taxonomy_name'
なので register_post_type
引数パラメーターまたは使用 register_taxonomy_for_object_type()
直接。カスタム分類法は引き続き登録する必要があります register_taxonomy()
.
(3)内部でクエリをしている間 new WP_Query ($args)
i)管理者に設定されていない場合 static front page
前に使用してください new WP_Query($args)
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
そして使用します $query = new WP_Query( array( 'paged' => $paged ) );
ii)「新しいwp_query($ args)」の前にadmin staticフロントページで設定されている場合:
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
そして使用します $query = new WP_Query( array( 'page' => $paged ) );
使用することを忘れないでください posts_per_page
と paged
パラメーター new WP_Query($arg)
引数配列。
静的なフロントページを設定しない場合は、使用する必要があります page
パラメーター new WP_Query ($arg)
引数配列。
(4)WordPressを使用します paginate_links( $args )
アーカイブテンプレートファイルでページネーションをレンダリングするための以下の例のように機能します。
<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%', or '/paged=%#%', // if using pretty permalink
'current' => max( 1, get_query_var('paged') ),
'total' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page
?>
(5) paginate_links()
関数出力 ul li
のリスト page-numbers
クラス。 Bootstrap Injectを使用する場合 pagination
クラスへ ul
JavaScriptまたはJQueryの助けを借りて、素敵な派手なページネーションが出力されます。
404問題なしに分類アーカイブテンプレートでページネーションを楽しむことができることを願っています:-)