I want to create a sitemap that only includes parent pages only.

This is the code I use usually to get parent pages only:

$args = array(
    'post_type' => 'page',
    'post_parent' => 0,
    'orderby' => 'rand',
    'posts_per_page' => 3,
    'post_status' => array('publish'),
);
$parents = new WP_Query($args);

And I used this sitemap code from this answer:

add_action( "save_post", "eg_create_sitemap" );   
function eg_create_sitemap() {
    $postsForSitemap = get_posts( array(
        'numberposts' => -1,
        'orderby'     => 'modified',
        'post_type'   => array( 'post', 'page' ),
        'order'       => 'DESC'
    ) );
    $sitemap = '<?xml version="1.0" encoding="UTF-8"?>';
    $sitemap .= "n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "n";    
    foreach( $postsForSitemap as $post ) {
        setup_postdata( $post );   
        $postdate = explode( " ", $post->post_modified );   
        $sitemap .= "t" . '<url>' . "n" .
            "tt" . '<loc>' . get_permalink( $post->ID ) . '</loc>' .
            "ntt" . '<lastmod>' . $postdate[0] . '</lastmod>' .
            "ntt" . '<changefreq>monthly</changefreq>' .
            "nt" . '</url>' . "n";
    }     
    $sitemap .= '</urlset>';     
    $fp = fopen( ABSPATH . "sitemap.xml", 'w' );
    fwrite( $fp, $sitemap );
    fclose( $fp );
}

It gets all pages so it is not what I am after and generated a sitemap.xml in my WP’s root.

Then I modified but it does not work – it still returns all pages. So I removed it the sitemap.xml in my root, but I get a 404 error.

Why? How come?

Read more here: Create a sitemap without a plugin – get parent pages only?


Solution:

If you know the solution of this issue, please leave us a reply in Comment section, to update the question.


Wordpress related questions and answers: