एकल- custom.php पर WP_Query अंकन


16

मैं क्या करने के लिए देख रहा हूँ:

WP_Queryएकल-कस्टम-पोस्ट- type.php टेम्पलेट फ़ाइल में सेटअप पृष्ठांकन

मैंने क्या किया है

1) "लेखक" नामक एक पोस्ट प्रकार बनाया गया। उस पोस्ट प्रकार के भीतर प्रत्येक पोस्ट एक व्यक्तिगत लेखक है।

2) मानक संपादन पोस्ट स्क्रीन पृष्ठों में एक ड्रॉपडाउन होता है जो लेखकों के कस्टम पोस्ट प्रकार से सभी पोस्ट (लेखकों) को सूचीबद्ध करता है।

3) एक एकल-लेखक.php टेम्पलेट बनाया गया है, जो ड्रॉपडाउन से लेखक मेटाडेटा के साथ सभी पदों को क्वेरी करता है, इसलिए परिणाम उन पोस्टों की एक सूची है जिनके पास एक ही लेखक को सौंपा गया है (एक संग्रह की तरह)

<?php

// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;

/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
    $paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
    $paged = get_query_var( 'page' );
} else {
    $paged = 1;
}

$args = array(
    'posts_per_page'    =>  10,
    'meta_key'          => 'author_select',
    'meta_value'        => $author_id,
    'paged'             => $paged,
);

$temp = $wp_query;
$wp_query = NULL;

$wp_query = new WP_Query($args);

?>

<?php if( $wp_query->have_posts() ) : ?>    
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>

    <?php endwhile; ?>

<div class="single_navigation"> 
    <?php if( get_adjacent_post( false, '', true ) ) { ?>
        <span class="prev"><?php previous_post_link( '&lt; %link' ) ?></span>
    <?php } ?>

    <?php if( get_adjacent_post( false, '', false ) ) { ?>
        <span class="next"><?php next_post_link( '%link &gt;' ) ?></span>
    <?php } ?>
    </div><!--/single navigation-->
<?php endif; ?>

<?php
    $wp_query = null;
    $wp_query = $temp;
    wp_reset_query();
?>

मैं किस बात पर अड़ा हुआ हूं

पेजेशन लिंक दिखाई नहीं देते हैं। मैंने कुछ शोध किए हैं और पाया है कि वे $wp_queryचर का उपयोग करते हैं, हालांकि जब मैंने अपने क्वेरी चर को बदल दिया$wp_query , तो लिंक दिखाई दिए, लेकिन जब क्लिक ने कुछ नहीं किया।

कोई भी विचार जहां मैं गलत हो रहा हूं?

संपादित करें:

आपके कुछ सवालों के जवाब देने के लिए, मेरी क्वेरी सफलतापूर्वक उन पोस्ट्स को आउटपुट करती है जो मैं क्वेरी कर रहा हूं, $ author_id में पहले से ही एक मूल्य है जो मैंने इस कोड स्निपेट में शामिल नहीं किया था। इसी तरह, मैंने लूप के भीतर वास्तविक कंटेंट आउटपुट को छोड़ दिया क्योंकि वह हिस्सा इश्यू नहीं है। मुद्दा यह है कि मुझे उस सामग्री को पृष्ठांकित करने की आवश्यकता है जो पहले से ही इस एकल पोस्ट पर मौजूद है।

इस कार्यक्षमता का उद्देश्य पदों को कस्टम लेखकों (उपयोगकर्ता प्रणाली में निर्मित के बाहर) की अनुमति देना था और यह टेम्पलेट का उद्देश्य किसी दिए गए लेखक (जो पहले से काम कर रहा है) के लिए सभी पोस्टों का उत्पादन करना है।


3
एक अच्छी तरह से स्वरूपित प्रश्न के लिए एक upvote, हालांकि आपने यह नहीं बताया कि आप ऐसा क्यों कर रहे हैं, क्या यह वर्तमान लेखक बॉक्स द्वारा संबंधित पोस्ट है?
टॉम जम्मू नॉवेल

1
मैं वास्तव में @TomJNowell से सहमत हूं। +1
पीटर गोयन ने

2
असंबंधित, लेकिन यह गूंज करने के लिए आवश्यक नहीं हैthe_title()
पीटर गोयेन

2
है 'meta_value' => $author_idउल्लेख किया ड्रॉप-डाउन से भरा जा रहा? और ड्रॉपडाउन के माध्यम से प्रत्येक लेखक का चयन करते समय, क्या पहले दस पोस्ट सही तरीके से दिखाई दे रहे हैं?
स्टीफन एस।

1
क्या आपने सुनिश्चित किया है कि $author_query->have_posts()रिटर्न trueऔर $author_queryवास्तव में कोई भी पद शामिल हैं?
kaiser

जवाबों:


17

आपको 2 समस्याएँ हैं।

पहली समस्या

रेखा

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

विफल हो जाएगा, क्योंकि एकवचन पोस्ट दृश्य पर, जब URL समाहित होता है '/page/XX/' , तो चर वर्डप्रेस सेट होता है 'page'और नहीं'paged'

आप उपयोग करने के लिए सोच सकते हैं 'page' इसके बजाय करने के हैं 'paged', लेकिन वह भी काम नहीं करेगा, क्योंकि एक बार जब 'page'चर का उपयोग बहु-पृष्ठ एकवचन पोस्ट (पेज सेपरेशन का उपयोग करके <!--nextpage-->) के लिए किया जाता है और एक बार पोस्ट बहु-पृष्ठ नहीं है, तो वर्डप्रेस अनुरोध को पुनर्निर्देशित करेगा। बिना URL के '/page/XX/'

यह तब होता है जब आप अपने क्वेरी चर का नाम देते हैं $wp_query

समाधान इसके लिए जिम्मेदार फ़ंक्शन को हटाकर उस पुनर्निर्देशन को रोकने के लिए है, जो इसमें 'redirect_canonical'झुका हुआ है 'template_redirect':

तो, अपने में functions.php ऐड में:

add_action( 'template_redirect', function() {
    if ( is_singular( 'authors' ) ) {
        global $wp_query;
        $page = ( int ) $wp_query->get( 'page' );
        if ( $page > 1 ) {
            // convert 'page' to 'paged'
            $wp_query->set( 'page', 1 );
            $wp_query->set( 'paged', $page );
        }
        // prevent redirect
        remove_action( 'template_redirect', 'redirect_canonical' );
    }
}, 0 ); // on priority 0 to remove 'redirect_canonical' added with priority 10

अब वर्डप्रेस अब रीडायरेक्ट नहीं होगा और 'paged'क्वेरी संस्करण को सही ढंग से सेट करेगा ।

दूसरी समस्या

next_posts_link() तथा previous_posts_link() दोनों की जाँच करेंif ( ! is_single() ) अंकुरण प्रदर्शित करने के लिए करते हैं।

अभी, is_single() आपके मामले में सच है, क्योंकि आप 'लेखक' प्रकार के एक ही पद पर हैं, इसलिए वे फ़ंक्शन आपके अपेक्षा के अनुरूप काम नहीं कर सकते हैं।

आपके पास 3 संभावनाएँ हैं:

  1. query_postsमुख्य क्वेरी को ओवरराइड करने के लिए उपयोग करें (वास्तव में नहीं अनुशंसित )
  2. कस्टम पोस्ट प्रकार के बजाय कस्टम पेज टेम्पलेट का उपयोग करें , क्योंकिis_single() पृष्ठों के लिए गलत है, और आपका कोड वहां काम करेगा।
  3. अपने स्वयं के पृष्ठ पर अंक लगाना फ़ंक्शन का उपयोग करें और उसका उपयोग करें

यह समाधान नंबर # 3 का कोड है:

function my_pagination_link( $label = NULL, $dir = 'next', WP_Query $query = NULL ) {
    if ( is_null( $query ) ) {
        $query = $GLOBALS['wp_query'];
    }
    $max_page = ( int ) $query->max_num_pages;
    // only one page for the query, do nothing
    if ( $max_page <= 1 ) {
        return;
    }
    $paged = ( int ) $query->get( 'paged' );
    if ( empty( $paged ) ) {
        $paged = 1;
    }
    $target_page = $dir === 'next' ?  $paged + 1 : $paged - 1;
    // if 1st page requiring previous or last page requiring next, do nothing
    if ( $target_page < 1 || $target_page > $max_page ) {
        return;
    }
    if ( null === $label ) {
        $label = __( 'Next Page &raquo;' );
    }

    $label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label );
    printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), esc_html( $label ) );
}

और इसका उपयोग इस तरह से करें single-authors.php:

my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );

बहुत विस्तृत जवाब, धन्यवाद! यह साइट के अंग्रेजी पक्ष के लिए काम कर रहा है, लेकिन फ्रांसीसी पक्ष में पृष्ठांकन लिंक कुछ भी नहीं करते हैं, वे केवल पृष्ठ को ताज़ा करते हैं। मैं WPML का उपयोग कर रहा हूं।
शेन

1
@ शाने ऐसा लगता है कि WPML कुछ फ़िल्टर चलाता है जो कोड को काम करने से रोकता है। लेकिन इतना बड़ा प्लगइन है, और इसलिए मैं यह समझने के लिए कोड की हज़ारों पंक्तियों को खोद नहीं सकता कि यह कहाँ है। WPML समर्थन से पूछने का प्रयास करें।
gmazzap

@Shen WPML सपोर्ट फोरम - और यदि ऊपर काम करता है (जो मुझे लगता है), तो कृपया इसे समाधान के रूप में चिह्नित करें। WPML संघर्ष वैसे भी इस साइट के दायरे से बाहर है।
केसर

शानदार जवाब, मुख्य रूप से क्योंकि इससे मुझे अपने पृष्ठांकन समस्या को ठीक करने में मदद मिली। मैं एक समान कार्य कर रहा हूं और लूप ओवर करने के लिए एक दूसरा WP_Query बनाया है। मैं कहा जाता है the_posts_pagination, लेकिन जैसा कि इस सवाल में उल्लिखित मूल wp_query की एक प्रति निकालना पड़ा: wordpress.stackexchange.com/questions/216821/...
अलेक्जेंडर Holsgrove

1
आप @HongPong सही हैं, ठीक है, धन्यवाद।
gmazzap

0

एक और इसी तरह के डब्ल्यूपीएसई प्रश्न के आधार पर " पेजिनेशन कस्टम फ़ील्ड्स wp_query काम नहीं कर रहा है", मैं आपको global $paged;अपनी टेम्पलेट फ़ाइल की शुरुआत में जोड़ने का सुझाव दूंगा :

global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

1
जवाब के लिए धन्यवाद! दुर्भाग्य से यह कोई फर्क नहीं पड़ता है। अंकन लिंक दिखाई नहीं देता है
शेन

1
स्टीफन, वह मदद क्यों करे? हां, यह इसे वैश्विक संदर्भ से सामने लाएगा, लेकिन अभी तक आप इसके साथ कुछ नहीं कर रहे हैं। यदि आप वैश्विक को ओवरराइड करना चाहते हैं, तो उपयोग करें $GLOBALS['paged'] = get_query_var( 'paged' );। केवल ग्लोबल्स सामग्री का उपयोग करें।
केसर k

@ शेन हम्म, टेम्पलेट पेज को स्टैटिक फ्रंट पेज के रूप में इस्तेमाल किया जा रहा है?
स्टीफन एस

नहीं, यह केवल कस्टम पोस्ट प्रकार के लिए एकल पोस्ट टेम्पलेट के रूप में उपयोग किया जा रहा है। मैं से मेरी क्वेरी परिवर्तित करने का प्रयास किया था $author_queryकरने के लिए $wp_queryऔर कहा कि पृष्ठांकन प्रदर्शित करने के लिए लग रहा था, लेकिन जब मैं उस पर पृष्ठ रीफ्रेश क्लिक करें और वास्तव में अगले पृष्ठ पर जाने नहीं करता है, भले ही एक से अधिक पृष्ठों हैं। मैंने उन परिवर्तनों को दर्शाने के लिए अपना उत्तर अपडेट कर दिया है।
शेन

1
Php.net स्पष्टीकरण है कि बुरा नहीं है। मैं बस के साथ globalऔर आसपास खेलने का सुझाव देता हूं $GLOBALS। थोड़ा var_dump(), कुछ कार्य और आप ठीक हैं। इसे वास्तव में समझने की थोड़ी सी कोशिश / त्रुटि के साथ आप अनुमानित करेंगे। आधा घंटा चाहिए। यह आपको वर्गों और ओओपी दृष्टिकोण के साथ-साथ संपूर्ण कार्यों को समझने में बहुत मदद करेगा। और यह स्पष्ट रूप से आपको नामस्थानों को समझने के करीब लाएगा :)
kaiser
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.