我和我一起工作的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>
有人对此有意见吗?
答案 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>