2017-07-08 169 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>