40

I have set the blog to be a different page other than the home page.

I want to have a link from single.php to this blog page.

Is there any function that pulls out URL for the blog ?

75

To build on Sagive's answer, you'll want to wrap the ID in get_permalink() to get the actual link.

<a href="<?php echo get_permalink( get_option( 'page_for_posts' ) ); ?>">Our Blog</a>
29

As of WordPress 4.5 you can use:

get_post_type_archive_link( 'post' );

This handles the logic of getting the correct URL regardless of whether posts show up on the homepage or in a specified page.

5

Best way to check the option before setting the permalink is as follows:

if ( get_option( 'page_for_posts' ) ) {
   echo '<a href="'.esc_url(get_permalink( get_option( 'page_for_posts' ) )).'">'.esc_html__( 'Blog', 'textdomain' ).'</a>';
} else {
   echo '<a href="'.esc_url( home_url( '/' ) ).'">'.esc_html__( 'Blog', 'textdomain' ).'</a>';
}
3

You can use get_option of page_for_posts to get the page ID to either assign it to a variable or to echo it if you wish to do so.

<?php $postsPageId = get_option('page_for_posts'); ?>
<a href="index.php?p=<?php echo $postsPageId; ?>">Our Blog</a>

For additional information of the defualt get_option visit: Option Reference

1

Agree with the Hugh Man that it is better to check the option before echoing the link, but it is possible to set the static page as a front page and leave the posts page empty. In this case, the link will just point to the home URL. A better approach is to provide a fallback to the posts archive page. Something like this:

function slug_all_posts_link() {
    if ( 'page' == get_option( 'show_on_front' ) ) {
        if ( get_option( 'page_for_posts' ) ) {
            echo esc_url( get_permalink( get_option( 'page_for_posts' ) ) );
        } else {
            echo esc_url( home_url( '/?post_type=post' ) );
        }
    } else {
        echo esc_url( home_url( '/' ) );
    }
}
  • You don't have to esc_url the get_permalink and home_url functions – Tolea Bivol Apr 7 '17 at 7:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.