it-swarm.asia

تحديد ترقيم الصفحات مع أرشيف التصنيف المخصص

كنت أحاول إعداد طريقة لكتابة المشاركات في سلسلة على موقعي. والفكرة هي أن كل منشور يمكن أن ينتمي إلى سلسلة مختلفة في تصنيف مخصص. لقد حصلت على كل شيء تم إعداده بالطريقة التي أريدها ... مع استثناء واحد.

تسجيل التصنيف

هذا الجزء يعمل. لقد أسقطت الكود التالي في مكون إضافي:

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 );

هذا يضيف "تسميات السلسلة" إلى القائمة المنسدلة "النشرات" ويعطيني مربع "تسميات السلسلة" على شاشة تعديل النشر. كل شيء يعمل ، وأستطيع وضع علامة على المشاركات كجزء من سلسلة بشكل مثالي. تكمن المشكلة في القسم التالي ...

ادراج البنود في التصنيف

هدفي هو السماح للقراء بالتجول في سلسلة منشورات واحدة في كل مرة ، بدءًا من أقدم مشاركة والتقدم للأمام زمنياً. هذا يختلف عن صفحة الأرشيف النموذجية ، لأن لدي 10 مشاركات لكل صفحة لأرشيفاتي ، لكن من الواضح أنني أريد منشور واحد فقط لكل صفحة لأرشيف السلسلة الخاص بي.

لقد قمت بإنشاء ملف taxonomy-series.php داخل القالب الخاص بي. و نصف الأشغال. ستعمل الصفحة الأولى بشكل جيد - http://localhost/wp/series/my-test-series/ تعرض المقالة الأولى في السلسلة مع رابط "الإدخال التالي" في أسفل الصفحة. حتى الان جيدة جدا ...

ولكن عندما تنقر على "الإدخال التالي" "وانتقل إلى الصفحة التالية (http://localhost/wp/series/my-test-series/page/2/) فهي أ) المقالة الخطأ و ب) القالب الخطأ!

ومع ذلك ، إذا قمت بتعيين "تظهر صفحات المدونة على الأكثر:" إلى "1" في صفحة القراءة (عادةً ما تكون إلى 10) فإن الأشياء تعمل بشكل جيد. تعرض الصفحة 2 المقالة الثانية ، بينما تعرض الصفحة 3 المقالة الثالثة ، إلخ.

لذلك ... ما الذي أحتاجه للتحقق من ضعف لإجبار صفحة أرشيف التصنيف لعرض منشور واحد فقط في كل صفحة؟ لقد جربت ما يلي:

$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);

ولكن دون جدوى ... الأفكار؟ نصائح؟ اقتراحات؟

4
EAMann

مرحبًا @ إيمان :

أنا في أي وقت أحتاج إلى القيام بشيء مبدع باستخدام عناوين URL في WordPress لأن نظام URL في رأيي هو الجانب الأكثر استحسانًا من WordPress. أشعر دائمًا بأنني مضطر إلى محاربة WordPress للحصول عليه لأفعل ما أريد ، وأن WordPress يناضل بشدة فيما يتعلق بعناوين URL. لذلك مع هذا الافتتاحية ...

بالتفكير في مشكلتك ، سأقدم اقتراحًا ليس بالضبط ما طلبته. إذا لم تجد أن ما تبحث عنه على ما يرام ، فقط يرجى عدم التصويت لأي شخص لأنني فقط أحاول المساعدة.

التصنيف ليس زيادة فردية وليس له ميتا

واحدة من المشاكل مع ما تحاول القيام به هي نظام التصنيف لا يوجد طلب زيادة واحد و لا يحتوي على ملف تعريف . على سبيل المثال ، في سلسلة منشورات 3 ، قد تجد مصطلحات مع IDs لـ 373 و 411 و 492 ؛ يمكنك معرفة ذلك 373 = #1 و 411 = #2 و 492 = #3 ولكن هذا كله حدث بالنسبة إلى بعضهما البعض. إنه مثل محاولة تحديد موقع جذر موقع WordPress الخاص بك في رمز البرنامج المساعد ولكنك لا تعرف عدد المستويات التي سيتم تخزين الشفرة فيها. بالطبع يمكنك كتابة التعليمات البرمجية لتحديد كل شيء وتعيينها ولكن هذا أمر صعب ولست متأكدًا من أنك ستحصل على قيمة كبيرة من محاولة اكتشافها بدلاً من استخدام طريقة مختلفة.

صراحة تخصيص أرقام صفحتك

لذا فإن أول ما أود أن أقترحه هو you تعيين صراحة your أرقام الصفحات لكل مشاركة في سلسلتك باستخدام حقول النشر التعريفية/المخصصة (اخترت المصطلح installment بدلاً من ذلك) لـ page لأنه كان أكثر منطقية بالنسبة لي ولكن من الواضح أنه يمكنك استخدام أي مصطلح يناسب حالة الاستخدام الخاصة بك.)

إن تعيين أرقام الصفحة/الدفعة له فائدة لك في التحكم الكامل ، وبهذه الطريقة ستعرف ما الذي يجب إصلاحه عندما يخرج شيء ما ، وإذا كنت تريد إعادة الترتيب ، فيمكنك القيام بذلك فقط عن طريق تغيير الأرقام. أفترض أنك ستحصل على تحرير metabox لاسم حقل مخصص _installment لاختيار أرقام القسط (ويمكنه أيضًا إدارة/دمج أرقام الأقساط عبر AJAX _ إذا كنت تريد أن تصبح مبدعًا حتى لا تكون أبدًا لديك صفحات خارج المزامنة.)

استخدم $wp_rewrite->add_rule() لتعيين عنوان URL الخاص بك بشكل صريح

لن أذهب إلى العمق لأنني أعلم أنك غاضب من WordPress skilz عمومًا ، لذلك سأشير فقط إلى أن $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 إلى Vars Vars

يستخدم النصف الثاني من هذا الحل ربط 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 ساعة الماضية ، والأهم من ذلك أنني أعلم أنه يمكنك معرفة ذلك ، ربما كنت بحاجة فقط إلى شيء واحد ذكرته هنا .

لذلك آمل أن تكونوا مثل هذا الحل. حتى إذا لم تقم بجزئين "init" و "parse_query" و "$wp_rewrite->add_rule()" و "$query->query_vars[]" على التوالي ، فهي ما تحتاجه حتى إذا كنت ترغب في التمسك بالبنية الأصلية. حظا سعيدا ونتطلع إلى رؤيته عندما تفعل ذلك وعلى الإنترنت!

على أي حال ، آمل أن يساعد هذا.

6
MikeSchinkel

إليك الرمز الذي أستخدمه لتعديل عدد المنشورات في صفحات الأرشيف للفئات والعلامات:

query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );

إذا لم تتمكن من التعامل مع التصنيف المخصص ، فحاول استخدام أصلي (فئات ، علامات) للتحقق مما إذا كانت المشكلة تتعلق بالكود نفسه ، أو مع التصنيف أو أي شيء آخر بالكامل.

كما أنني لست متأكدًا مما إذا كنت قد فاتتك هذا أم لم تستبعد ، لكن $ paged ليس متغيرًا عموميًا. يجب جلبه كـ get_query_var ('paged')

2
Rarst

بمجرد أن واجهت مشكلة في هذا الأمر ، مررت بأوقات عصيبة على مدار الساعة بسحب الشعر. أنا googled ولم أجد أي حل محدد حول الموضوعات. لقد وجدت مقالا للعديد من المواهب لكنها لم تكن ترضي مشاكلي. في الواقع يعتمد ترقيم الصفحات بصفحة أرشيف التصنيف المخصص على بعض إعدادات وسيطات الدالات ذات الصلة. لذلك أنا هنا في الواقع أشارك أفكاري في حل مشكلة ترقيم الصفحات في أرشيف التصنيف.

خمسة أشياء تحتاجها لترتيب صفحات الصفحات في تصنيف مخصص يعمل تمامًا:

(1) لا تضع مفتاح المعلمة exclude_from_search كمعلمة وسيطة 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) إذا تم تعيينه في الصفحة الأولى من صفحة static static الثابتة قبل "WP_Query الجديدة ($ args)":

  $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 class إلى ul بمساعدة javascript أو jquery وسوف يتم إخراج ترقيم الصفحات الجميل.

آمل أن تتمكن الآن من الاستمتاع بصفحة ترقيم الصفحات في قالب أرشيف التصنيف دون أي مشكلة 404 :-)

0
saifulmasud