2017-07-08 4 views
0

で重複を示しています。これを行うには、明らかに私はすべての記事とWordpressのインストール内のページをループする必要があります。私はクイック機能を書いてライブサイトのサーバにアップロードして、それが機能しているかどうかを確認しました。は私と私が(何らかの理由で)私たち自身のサイトマップを生成したいと働いているSEOの男の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

それはまったく異なるインストールであり、関係はありません。私は自分のローカルコンピュータに新しいデータベースを作成し、新しいWordPressのコピーをインストールしました。それから3つの新しい投稿を作成し、5つの投稿を印刷します。私がちょうどdupsなしで私のポストのリストを簡単に得ることができないのは狂気です...私はワードプレスを嫌う。 –

+0

しかし、あなたはあなたのローカル環境にライブDBをコピーするだけでなぜですか?あなたのコードのためか、DBの違いのためかを簡単に知ることができます。 –

答えて

0

はその後、私はちょうど残りの部分を処理するために定期的にPHPを使用して、私が取得するために必要なデータのためのWPのクエリを使用するソリューションを考え出しました。不要かもしれないが、私は無駄なWordpressのドキュメントを歩き回る私の時間を無駄にするような気がしなかった。

私は、関数の先頭に空の配列をインスタンス化した後、ポストのすべてをループ、そのIDを抽出し、そして私が作成した配列の中にそれらをプッシュ。 whileループが終了したら

、私の配列によるIループ、および各ポストのために必要な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> 
関連する問題