WordPress.org

Ready to get started?Download WordPress

Forums

Checking if there are next posts (8 posts)

  1. jalenack
    Member
    Posted 9 years ago #

    Ok, so I'm working on a theme and I want it to check if there are next posts to display. Something along these lines:

    <?php if (next_posts_link() || previous_posts_link()) { ?>
    <div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
    <div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
    <?php } ?>

    Of course, this doesn't work, because if next_posts_link does have something, it echoes it instead of returns it, and the whole thing stops.

    So, there is no get_previous_posts_link or anything like that, so what do I do? I can't just have it display nothing in an empty div, because there are other elements I want to wrap these links in, but only if they exist. Understand what I mean? How can I check if there are other pages without echoing the page links?

    Thanks for any help

  2. idiotboy
    Member
    Posted 9 years ago #

    I tried the exact same 'gee I hope this works!' code. No go. I know what you mean - at the moment either the nav links are there when required or there is a big gap when there arent any other pages to navigate to. Need a function to ask wether there is a next or previous page to navigate to so the navigation space is only written when necessary.

  3. Joshua Sigar
    Member
    Posted 9 years ago #

    Can you not do the following?

    if( get_next_post() || get_previous_post() ) {
    ...
    }

  4. idiotboy
    Member
    Posted 9 years ago #

    nope - i assume those functions u mention return true or false if the post has a next or previous post. What we want is a function that returns true or false if the current page of posts has a previous or next page of posts.

  5. Joshua Sigar
    Member
    Posted 9 years ago #

    I see. Well, you could always grab a piece of code from the core and make your own custom functions.

  6. I used the following on one of my blogs to not display the thing if there was gonna be no output. Maybe it'll help you:

    <?php if (posts_nav_link('&nbsp;&nbsp;', '&laquo; Newer News', 'Older News &raquo;')) { posts_nav_link('&nbsp;&nbsp;', '&laquo; Newer News', 'Older News &raquo;'); echo ""; } ?>

    In action: http://www.finalgear.com/
    Not being shown: http://www.finalgear.com/category/off-topic/

  7. idiotboy
    Member
    Posted 9 years ago #

    ok - got it working now:

    I copied the two functions responsible for generating the links - next_posts_link and previous_posts_link and renamed them has_next_posts and has_previous_posts. Then replaced the bit where it echoes its output with -

    return true
    else return false

    So now i can go -

    if (has_next_posts || has_previous_posts) {
    //put nav block in
    }

    I was confused a bit coz there is a function named 'next_post_link' and 'next_posts_link' and I was looking at the wrong one.

    Thanks for the help viper and alphaoide.

  8. jayp
    Member
    Posted 8 years ago #

    I had to figure this one out too. But, I strongly did not want to modify the core files (because of the trouble that comes when updating). After way more work than should have been necessary, I came up with this solution, which I'm quite proud of...

    I've written two functions and put them into a file called _extra_functions.php in the directory of my template...

    This file has these two functions:

    <?php
    //functions tell whether there are previous or next 'pages' from the current page
    //returns 0 if no 'page' exists, returns a number > 0 if 'page' does exist
    //ob_ functions are used to suppress the previous_posts_link() and next_posts_link() from printing their output to the screen

    function has_previous_posts() {
    ob_start();
    previous_posts_link();
    $result = strlen(ob_get_contents());
    ob_end_clean();
    return $result;
    }

    function has_next_posts() {
    ob_start();
    next_posts_link();
    $result = strlen(ob_get_contents());
    ob_end_clean();
    return $result;
    }
    ?>

    The "magic" is by using PHP's ob_ functions to capture the output from the native wordpress functions and prevent them from printing to the screen.

    Then, whereever I need to use it, I do this...

    <?php include (TEMPLATEPATH . '/_extra_functions.php'); ?>
    <?php if ( has_previous_posts() || has_next_posts() ) { // only show if previous or next links are needed ?>

    //nav block goes here

    <?php } //end if ?>

    Thought I should post in case this could help someone else.

Topic Closed

This topic has been closed to new replies.

About this Topic

Tags

No tags yet.