कस्टम SQL क्वेरी के साथ पृष्ठ पर अंक लगाना


9

विशिष्ट WHERE क्लॉज के साथ कस्टम पोस्ट प्रकार के पदों का चयन करने के लिए मेरा अपना एसक्यूएल स्ट्रिंग है। मैंने एक पृष्ठ प्रदर्शित होने के आधार पर उपयुक्त पोस्ट वापस करने के लिए ऑफ़सेट और सीमा का उपयोग किया है। वह ठीक काम कर रहा है।

अब, मैं काम करना previous_posts_link()और बनाना चाहूंगा next_posts_link()। वे दोनों कहे जाते हैं get_posts_nav_linkजिनसे उपयोग होता है global $wp_query

क्या कोई ऐसा तरीका है जिसे मैं global $wp_queryअपने एसक्यूएल स्ट्रिंग या $wpdb->get_resultsपरिणाम या किसी और चीज के साथ फिर से असाइन कर सकता हूं ? तो देशी previous_posts_link()और next_posts_link()WP फ़ंक्शन काम करेंगे।

यदि नहीं, तो मैं प्रचलित और अगली पोस्ट लिंक फ़ंक्शंस को कैसे पुन: पेश कर सकता हूं?

मैं वास्तव में किसी भी मदद और सलाह की सराहना करेंगे! मैं इसके साथ पूरी तरह से फंस गया हूं।
धन्यवाद :)

नोट: मैंने अभी देखा है कि previous_posts_link()सभी पृष्ठों पर सही ढंग से काम हो रहा है, लेकिन no idea whyइस मामले में, next_posts_linkयह काम क्यों नहीं करता है: एस

यहाँ कोड है:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$post_per_page = intval(get_query_var('posts_per_page'));
$offset = ($paged - 1)*$post_per_page;

$sql = "
SELECT SQL_CALC_FOUND_ROWS  wp_posts.*, wp_postmeta.* 
FROM wp_posts 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
WHERE 1=1  
    AND wp_posts.post_type = 'movie' 
    AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
    AND ((wp_postmeta.meta_key = '_expiry_date' AND CAST(wp_postmeta.meta_value AS DATE) >= '".$current_date."') 
        OR (mt1.meta_key = '_expiry_date' AND CAST(mt1.meta_value AS CHAR) = ''))
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC
LIMIT ".$offset.", ".$post_per_page;

$movies_all_current = $wpdb->get_results( $sql, OBJECT);

if($movies_all_current) {
global $post;

//loop
foreach( $movies_all_current as $key=>$post ) {
    setup_postdata($post);
    //display each post
    //...
} //end foreach ?>

    //navigation
<div class="navigation">
    <div class="previous panel"><?php previous_posts_link('&laquo; newer') ?></div>
    <div class="next panel"><?php next_posts_link('older &raquo;') ?></div>
</div>
}

जवाबों:


16

ठीक है, मैं अंत में वहाँ गया। मैं WP_Queryवर्ग का उपयोग नहीं कर सकता क्योंकि मुझे वास्तव में अपने बहुत बड़े और जटिल एसक्यूएल की आवश्यकता थी। यहाँ है कि मैं क्या हो रहा है:

में functions.phpमैं मान WP पृष्ठांकन तर्क के लिए आवश्यक गिनती के लिए अपने कस्टम एसक्यूएल और तर्क है:

function vacancies_current( ){
    global $wpdb, $paged, $max_num_pages, $current_date;

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $post_per_page = intval(get_query_var('posts_per_page'));
    $offset = ($paged - 1)*$post_per_page;

    /* Custom sql here. I left out the important bits and deleted the body 
     as it will be specific when you have your own. */
    $sql = "
        SELECT SQL_CALC_FOUND_ROWS  {$wpdb->posts}.*
        FROM {$wpdb->posts}
        ....
        GROUP BY {$wpdb->posts}.ID 
        ORDER BY {$wpdb->posts}.post_date DESC
        LIMIT ".$offset.", ".$post_per_page."; ";   

    $sql_result = $wpdb->get_results( $sql, OBJECT);

    /* Determine the total of results found to calculate the max_num_pages
     for next_posts_link navigation */
    $sql_posts_total = $wpdb->get_var( "SELECT FOUND_ROWS();" );
    $max_num_pages = ceil($sql_posts_total / $post_per_page);

    return $sql_result;
}

फिर मेरी टेम्पलेट फ़ाइल में मेरे पास होगा:

<?php 
    $vacancies_current = vacancies_current();
    /*followed by a standart loop to display your results */ 
 ?>
<div class="navigation">
    <div class="previous panel"><?php previous_posts_link('&laquo; previous vacancies',$max_num_pages) ?></div>
    <div class="next panel"><?php next_posts_link('more vacancies &raquo;',$max_num_pages) ?></div>
</div>

चाल की आपूर्ति में किया गया था previous_posts_link()और इसे सही ढंग से की गणना में मूल्य और स्पष्ट रूप से।next_posts_link$max_num_pages

यह बहुत अच्छा काम करता है। आशा है कि यह किसी की मदद करेगा :)

दशा


+1 अच्छा काम। मैं इस में आए (और भारी उधार, धन्यवाद), जबकि करने के लिए मेरा उत्तर शोध stackoverflow.com/questions/16057059/... । मैं सोच रहा था कि यदि आप एक तरह से इस तरह एक कस्टम एसक्यूएल बयान का उपयोग करने के बारे में पता है, लेकिन एक pre_get_posts में () के अनुसार कार्रवाई codex.wordpress.org/... ? मुझे लगता है कि यह समाधान wordpress.org/support/topic/… के अनुसार अंतिम पृष्ठ पर 404 के लिए अतिसंवेदनशील है । आपने इसे कैसे पार किया?
सेपस्टर

1

कस्टम क्वेरी पर एक नज़र डालें - जो आपको कई दिलचस्प और उपयोगी तरीकों से wp_query कॉल को संशोधित करने और परिणामों को अपनी वैश्विक क्वेरी ऑब्जेक्ट में वापस लाने की अनुमति देती है।


1

अनु के जवाब पर विस्तार। अपने कस्टम sql क्वेरी पर निर्भर होने के बजाय आप WP_Query वर्ग का उपयोग कर सकते हैं और वर्डप्रेस को सभी भारी SQL उठाने को संभालने दें। यह निश्चित रूप से आपके नेविगेशन मुद्दे को हल करेगा।

आपके _expiry_date meta_key के भीतर मूवी पोस्ट प्रकार के लिए उदाहरण क्वेरी:

$today = getdate();
$args = array(
    'post_type' => 'movie',
    'meta_query' => array(
            'meta_key' => '_expiry_date',
            'meta_value' => $today,
            'meta_compare' => '< '
                    ),
    'posts_per_page' => -1,
     'order'    => 'DESC'
    );

    $movie_query = new WP_Query( $args );

    while ( $movie_query->have_posts() ) : $movie_query->the_post(); 
    // Do stuff
   endwhile; ?>

 <div class="navigation">
<div class="previous panel"><?php previous_posts_link('&laquo; newer') ?></div>
<div class="next panel"><?php next_posts_link('older &raquo;') ?></div>
</div>

उत्तर के लिए धन्यवाद, हालाँकि, मैं WP_Queryकक्षा पर भरोसा नहीं कर सकता क्योंकि मुझे अपनी कस्टम SQL बनाने की आवश्यकता है। मैं अंत में वहाँ गया था, मेरे जवाब देखें अगर रुचि :)
dashaluna

-2
<?php

global $wpdb, $paged;
query_posts($query_string . '&posts_per_page=9');
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$author = isset($_GET['author_name']) ? get_userdatabylogin($author_name) : get_userdata(intval($author));

query_posts($query_string . '&posts_per_page=9');

$args = array(
'post_type' => 'post',
'meta_query' => array(
        'meta_key' => 'autor',
    'post_status' => 'publish',
        'meta_value' => $author->id,
            ),
'paged' => $paged,
'posts_per_page' => 9,
'order'    => 'DESC'
);

$postsQuery = new WP_Query( $args );

?> 

टेम्पलेट:

<h1lánky od <?php echo $author->display_name; ?></h1>
        <ul class="thumbnails">

            <?php while ( $postsQuery->have_posts() ) : $postsQuery->the_post();  ?>
                <li class="span3">
                <div class="thumbnail">
                    <a href="<?php the_permalink(); ?>">
                    <?php the_post_thumbnail(array(260, 259)); ?>
                    </a>
                    <?php
                    $class = '';
                    if (in_category('fashion')) {
                    $class = "link-fashion";
                    } else if (in_category('beauty')) {
                    $class = "link-beauty";
                    } else if (in_category('gourmet')) {
                    $class = "link-gourmet";
                    } else if (in_category('lifestyle')) {
                    $class = "link-lifestyle";
                    } else if (in_category('about-us')) {
                    $class = "link-about";
                    }
                    ?>
                    <a href="<?php the_permalink(); ?>">
                    <h2 class="<?=  $class ?>">
                        <span></span>
                        <?php
                        // short_title('...', 25); 
                        echo get_the_title();
                        ?>
                    </h2>
                    </a>
                    <?php the_excerpt(); ?>
                    <hr>
                </div>
                </li>
            <?php endwhile; ?>

        </ul>
        <?php wp_pagenavi(); ?>

2
कृपया अपने कोड में एक स्पष्टीकरण जोड़ें, साथ ही, आप दो प्रश्नों को क्यों चला रहे हैं, एक के साथ query_postsऔर एकWP_Query
पीटर गोयन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.