2017-07-08 120 views
0

重复我和一个搜索引擎优化的家伙,我想用工作来产生我们自己的站点地图(出于某些原因)。要做到这一点,显然我需要遍历wordpress安装中的所有帖子和页面。我编写了一个快速功能,并将其上载到实时站点上的服务器上,以查看它是否有效,并确实如此。循环遍历所有的帖子显示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>"; 
    } 
} 

正如我所说,它的工作原理上线的站点,并且不打印重复。所以你不必担心自己与回声语句的语法,这里是将打印在网站上每篇文章:

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

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

任何人有这样的看法?

+0

您在本地环境中使用的是同一个数据库吗? –

+0

不是。这是完全不同的安装,它们没有任何关系。我甚至在我的本地计算机上创建了一个全新的数据库,并安装了新的wordpress副本。然后我创建了3个新帖子,并打印出5个帖子。这是疯狂,我不能轻易得到我的职位没有dups的名单...我讨厌WordPress的。 –

+0

但为什么不直接将实时数据库复制到本地环境?然后你可以很容易地判断是因为你的代码还是DB差异。 –

回答

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>