1

sitemap1.xmlsitemap2.xmlのように、各ファイルの URL が 1000 に制限されている複数のサイトマップ ファイルを保存するにはどうすればよいですか?

foreach基本的に各ファイルを で制限したいput_file_content

私のコードは次のとおりです。

$sitemap = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">
    <url>
    <loc>". Yii::app() -> getBaseUrl(true) ."</loc>
    <priority>1</priority>
    </url>
";
foreach($websites as $website) {
    $sitemap .= "<url>
        <loc>".$website['domain']."</loc>
        <priority>0.5</priority>
        </url>
    ";
}
$sitemap .= "</urlset>";
file_put_contents("sitemap.xml", $sitemap, LOCK_EX);
4

2 に答える 2

5

そのアプリケーションをすばやく作成しましょう。

  1. Web サイトを追加するテンプレート XML を作成します。
  2. $websitesaNoRewindIteratorと aを使用してチャンクするLimitIterator

2 番目のポイントから始めて、URL と XML を偽造して、これが簡単に接続できるかどうかを確認してみましょう。

$limit = 3;

$urls = new ArrayIterator(range(0, 9)); // 10 Fake URLs
$urls->rewind();

$it = new NoRewindIterator($urls);

まず、ファイルごとに制限を設定し (ここでは、テスト用に低く抑えるために3 つ)、URL のデータ ソースを設定します。これらは 10 個の偽の URL で、0 から 9 までの数字です。

これらの URL は にラップされ、NoRewindIterator決して巻き戻されないため巻き戻されますが、データ ソースを 1 回巻き戻したいと考えています (これはすべてのイテレーターで必要ではありませんが、一部のイテレーターではこれを正しく行うためです)。

NoRewindIteratorのサイズで X チャンクを取得し続けることができるように、巻き戻し操作は によってブロックされ$limitます。そして、それはまさに今行われていることです:

$fileCounter = 0;
while ($it->valid()) {    
    $fileCounter++;

    printf("File %d:\n", $fileCounter);

    $websites = new LimitIterator($it, 0, $limit);
    foreach($websites as $website) {
        printf(" * Website: %s\n", $website);
    }
}

が有効である限り$it(読み取り: 出力する URL がある限り)、新しいファイルが作成され (1 つから開始)、3 つの Web サイトがLimitIterator. その反復が完了すると、すべての Web サイト URL が消費されるまで続行されます。出力は次のとおりです。

File 1:
 * Website: 0
 * Website: 1
 * Website: 2
File 2:
 * Website: 3
 * Website: 4
 * Website: 5
File 3:
 * Website: 6
 * Website: 7
 * Website: 8
File 4:
 * Website: 9

これまでのところ、チャンクを行う方法を示しています (または、これはページネーションとも呼ばれます)。例が示すように、XML ドキュメントの作成に関する部分だけが欠落しています。

XML ドキュメントを作成するために、文字列を連結できますが、それは行いません。これをすべて完璧に行う既存のライブラリを使用します。そのライブラリは DOMDocument と呼ばれ、urlset 内の 2 つの例示的な場所を含むサイトマップ ファイルを作成する方法の例を次に示します。

$doc = new DOMDocument();
$doc->formatOutput = TRUE;

$nsUri    = 'http://www.sitemaps.org/schemas/sitemap/0.9';
$urlset = $doc->appendChild($doc->createElementNS($nsUri, 'urlset'));

$url = $doc->createElementNS($nsUri, 'url');
$location = $url->appendChild($doc->createElementNS($nsUri, 'loc', 'BASEURL'));
$priority = $url->appendChild($doc->createElementNS($nsUri, 'priority', '1'));

$urlset->appendChild(clone $url);

$priority->nodeValue = '0.5';
$location->nodeValue = 'TEST';
$urlset->appendChild(clone $url);

echo $doc->saveXML();

このコード例は、ドキュメントを作成する方法と、適切な名前空間を持つ要素をドキュメントに追加する方法を示しています。<url>また、複製することで簡単に変更および追加できるボイラープレート要素を作成する方法も示します。

この例の出力は次のようになります。

<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>BASEURL</loc>
    <priority>1</priority>
  </url>
  <url>
    <loc>TEST</loc>
    <priority>0.5</priority>
  </url>
</urlset>

これで、すべての一般的な問題が解決されました。必要なのは、これら 2 つを一緒に Web 化し、ディスクに保存することだけです。この例のために後の部分を省略し (パラメータとしてファイル名を に渡すだけですsaveXML)、代わりに XML を出力します。

<?php
/**
 * Save Sitemap XML Files Limit by 1000 URLs per each File
 *
 * @link https://stackoverflow.com/q/19750485/367456
 */

$limit = 3;

$urls = new ArrayIterator(range(0, 9)); // 10 Fake URLs
$urls->rewind();

$it = new NoRewindIterator($urls);

$fileCounter = 0;

$baseDoc               = new DOMDocument();
$baseDoc->formatOutput = TRUE;

$nsUri = 'http://www.sitemaps.org/schemas/sitemap/0.9';

while ($it->valid()) {
    $fileCounter++;

    $doc = clone $baseDoc;

    $urlset = $doc->appendChild($doc->createElementNS($nsUri, 'urlset'));
    $url    = $doc->createElementNS($nsUri, 'url');

    $location = $url->appendChild($doc->createElementNS($nsUri, 'loc', 'BASEURL'));
    $priority = $url->appendChild($doc->createElementNS($nsUri, 'priority', '1'));

    $urlset->appendChild(clone $url);
    $priority->nodeValue = '0.5';

    printf("File %d:\n", $fileCounter);

    $websites = new LimitIterator($it, 0, $limit);
    foreach ($websites as $website) {
        $location->nodeValue = $website;
        $urlset->appendChild(clone $url);
    }

    echo $doc->saveXML();
}

出力は、プレーン テキストではなく XML になります。

File 1:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>BASEURL</loc>
    <priority>1</priority>
  </url>
  <url>
    <loc>0</loc>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>1</loc>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>2</loc>
    <priority>0.5</priority>
  </url>
</urlset>
File 2:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>BASEURL</loc>
    <priority>1</priority>
  </url>
  <url>
    <loc>3</loc>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>4</loc>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>5</loc>
    <priority>0.5</priority>
  </url>
</urlset>
File 3:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>BASEURL</loc>
    <priority>1</priority>
  </url>
  <url>
    <loc>6</loc>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>7</loc>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>8</loc>
    <priority>0.5</priority>
  </url>
</urlset>
File 4:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>BASEURL</loc>
    <priority>1</priority>
  </url>
  <url>
    <loc>9</loc>
    <priority>0.5</priority>
  </url>
</urlset>

あとは、最初に元のデータ ソースを反復子として提供し、URL の数 (制限) を独自の値まで増やして、正しいベース URL を追加するだけです。各ファイル(本当に必要な場合)。

XML サイトマップに関する限り、他のファイルにリンクする 1 つのファイルを作成することもできます。複数のサイトマップ: robots.txt にエントリがありますか? .

これが、確立された方法で探しているものを達成するのに役立つことを願っています.

于 2013-11-03T13:31:27.133 に答える