在所有帖子中循环显示Wordpress

时间:2017-07-08 15:10:16

标签: php wordpress

我和我一起工作的SEO人想要生成我们自己的站点地图(出于某些原因)。为此,显然我需要遍历wordpress安装中的所有帖子和页面。我写了一个快速功能,并将其上传到现场网站上的服务器,看它是否有效,而且确实如此。

然而奇怪的是,当我尝试在本地安装的wordpress(使用WAMP)上测试相同的功能时,它会多次打印出一些帖子名称(也就是重复名称)。我只是想知道这里是否有人知道可能正在发生的错误,或者我的代码是否需要更改。例如,我的代码现在可以在实时站点上运行,但是当我添加更多帖子时,我宁愿不再遇到这个问题,并且我开始在XML文件中看到重复项。

无论如何,这是我的代码:

<?php
$posts = new WP_Query('post_type=any&posts_per_page=-1&post_status=publish');
$posts = $posts->posts;

// Loop through each post, and echo out the url and it's amp extension.
foreach($posts as $post) {

    if($post->post_type == 'post') {
       $permalink = get_permalink($post->ID);
       echo "\n\t<url>\n\t\t<loc>{$permalink}</loc>\n\t</url>";
       echo "\n\t<url>\n\t\t<loc>{$permalink}amp/</loc>\n\t</url>";
    }
}

正如我所提到的,它适用于实际网站,并且不会打印重复项。所以你不必担心echo语句的语法,这里是为网站上的每个帖子打印的内容:

<url>
   <loc>https://www.somedomain.com/post1/</loc>
</url>

<url>
   <loc>https://www.somedomain.com/post1/amp/</loc>
</url>

有人对此有意见吗?

1 个答案:

答案 0 :(得分:0)

找出一个解决方案,使用WP查询我需要检索的数据,然后我只使用常规PHP来处理其余的。可能没必要,但我不想浪费我的时间在无用的Wordpress文档中漫游。

我在函数的开头实例化一个空数组,然后循环遍历所有帖子,提取它们的id,然后将它们推送到我创建的数组中。

while循环结束后,我遍历我的数组,并打印出每个帖子所需的xml。非常简单,并不会创建重复。

$xml = "";
$posts = array();

$q = new WP_Query(array(
    'post_type' => 'any',
    'post_status' => 'publish',
    'posts_per_page' => 50000,
    'has_password' => false,
));

// Loop through all posts, and push each id to the new posts array
if ($q->have_posts()) {
    while ($q->have_posts()) {
        $q->the_post();

        if(get_post_type() == 'post') {
          $id = get_the_ID();
          array_push($posts, $id);
        }
    }
}

// Loop through posts array and append the posts info into xml format
foreach($posts as $post) {
  $xml .= "<url>\n";
  $xml .= "\t<loc>\t\n";
  $xml .= "\t\t" . esc_url(get_permalink($post));
  $xml .= "\n\t</loc>\t";
  $xml .= "\n</url>\n\n";
}

我在这里省略了放大器部分,但是,在我的代码中,我也为每个帖子打印出一个放大器扩展。最终结果打印出来就是这样。

<url>
    <loc>   
        http://www.domainname.com/blog/article1
    </loc>  
</url>

<url>
    <loc>   
        http://www.domainname.com/blog/article2
    </loc>  
</url>