質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

sitemap.xmlの書きだし方変更

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 560

emporiol

score 7

 前提・実現したいこと

sitemap.xmlの仕様変更で<priority>,<changefreq>項目の追加のしかた。

 発生している問題・エラーメッセージ

sitemap.xmlの<priority>を1.0、0.9、0.8で場合分けで出力
さらにchangefreqを出力できるコードの組み方がわかりません。
担当者がいきなり初心者の私になりphpがほぼわからない状態となっております。
このようなことを言うのはずるいかもしれませんが、もしよろしければ足りないコードの組み方を教えてください!!
どうかお願いいたします!!
正直答えそのものを頂かないと全くわからない状況です”!

 該当のソースコード

////現在のコード

    $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" ?>'.'<urlset  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>');

    // xmlノード追加(記事・マンスリー)
    if(count($publicSiteMap) > 0) {
        foreach($publicSiteMap as $val) {
            $xmla = $xml->addChild('url');
             $xmla->addChild('loc',$val);

        }
}
    $retXML = $xml->asXML();
    $retXML    = str_replace( "<url><loc><priority><changefreq>" , "\n<url><loc><priority><changefreq>" , $retXML );
    $retXML    = str_replace( "</urlset>" , "\n</urlset>" , $retXML );

    /****** xmlファイルの書き出し*****/
    $createFile = 'sitemap.xml';
    $putFileName = $docRoot."/".$createFile;

    file_put_contents ($putFileName, $retXML);

    mysql_close($con);

    $mess = "抽出バッチ終了時刻2:".date('Y,m/d H:i:s');
    echo $mess;
    //バッチ起動履歴ログ
    $log -> writeLog2($mess);




function getDirFiles($tar,$match)
{

    if ($handle = opendir($tar))
    {
      while (false !== ($file = readdir($handle)))
      {
        //echo $file."<br>";

       if ('.' == $file || '..' == $file)// 自分自身と上位ディレクトリを除外
       {
        continue;
       }// if

//echo preg_match($match, $file)."<br>";


            //ファイル名パターンにマッチしない場合除外
            if (!preg_match($match, $file)) {
                continue;
            } 

  /***** 制御文字、日本語文字処理 *****/

  // 制御文字置換
  $file00 = htmlspecialchars($file);
   // 日本語対策 UTF-8へコード変換
   $file01 = mb_convert_encoding($file00, 'UTF-8','HTML-ENTITIES,ASCII,JIS, EUC-JP, SJIS');

        //ファイル名取得
        $filename[] = $file01;

        //サイトマップ公開記事(仕事詳細)
        //$publicSiteMap[] = $siteURL."/contents/montly/".$filename;

    } //while

    closedir($handle);  // ディレクトリハンドルを閉じる

    return $filename;

    } //if
}//function
//現在の出力状況
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://sample1.com/</loc></url>
<url><loc>http://sample2.com/jbinf/00001/01.html</loc></url>
<url><loc>http://sample3.com/jbinf/00002/01.html</loc></url>
//出力変更例

<url>
  <loc>http://sample1.com/</loc>
  <priority>1.0</priority>
  <changefreq>weekly</changefreq>
</url>
<url>
  <loc>http://sample2.com/info/</loc>
  <priority>0.8</priority>
  <changefreq>weekly</changefreq>
</url>

 試したこと

$retXML    = str_replace( "<url><loc><priority><changefreq>" , "\n<url><loc><priority><changefreq>" , $retXML );
ここに<priority><changefreq>は入れましたがその前段階の設定がわかりません。

<?
//試したこと①
$siteURL = "http://example.com";
$changefreqs =[0=>"always",
   1=>"hourly",
   2=>"daily",
   3=>"weekly",
   4=>"monthly",
   5=>"yearly",
   6=>"never"];

$publicSiteMap[] = ["loc"=>$siteURL . "/search/sample1.html","priority"=>"1.0","changefreq"=>0];
$publicSiteMap[] = ["loc"=>$siteURL . "/search/sample2.html","priority"=>"0.8","changefreq"=>2];

$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" ?>' . '<urlset  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>');

// xmlノード追加(記事・マンスリー)
if (count($publicSiteMap) > 0) {
    foreach ($publicSiteMap as $map) {
        $xmla = $xml->addChild('url');
        foreach($map as $mapkey=>$mapvalue){
            if($mapkey === "changefreq"){
                $xmla->addChild($mapkey, $changefreqs[$mapvalue]);
            }else{
                $xmla->addChild($mapkey, $mapvalue);
            }
        }
    }

    $retXML = $xml->asXML();

    echo $retXML;
} 
?>
を秀丸エディタを用いて記述し実行しました。

 補足情報(FW/ツールのバージョンなど)

何か情報が足りないとかあるでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/07/02 07:41

    ベストアンサーは良いのですが本当に解決したのでしょうか?特にコードの解説も入れておりませんし、内容を理解されていないと今後困ると思うのですが。

    キャンセル

  • emporiol

    2018/07/02 07:49

    仰る通りです。次回から編集欄に記入致します。

    キャンセル

  • emporiol

    2018/07/02 07:51

    すいません、こういった所に投稿するのも初めてでしたので、タイミングがよくわかりませんでした。

    キャンセル

回答 1

checkベストアンサー

+1

連想配列でそれぞれの設定を入れて出力します。
changefreqについては決まった形式があるので手で打たずコード化します。

$siteURL = "http://example.com";
$changefreqs =[0=>"always",
   1=>"hourly",
   2=>"daily",
   3=>"weekly",
   4=>"monthly",
   5=>"yearly",
   6=>"never"];

$publicSiteMap[] = ["loc"=>$siteURL . "/search/sample1.html","priority"=>"1.0","changefreq"=>0];
$publicSiteMap[] = ["loc"=>$siteURL . "/search/sample2.html","priority"=>"0.8","changefreq"=>2];

$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" ?>' . '<urlset  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>');

// xmlノード追加(記事・マンスリー)
if (count($publicSiteMap) > 0) {
    foreach ($publicSiteMap as $map) {
        $xmla = $xml->addChild('url');
        foreach($map as $mapkey=>$mapvalue){
            if($mapkey === "changefreq"){
                $xmla->addChild($mapkey, $changefreqs[$mapvalue]);
            }else{
                $xmla->addChild($mapkey, $mapvalue);
            }
        }
    }

    $retXML = $xml->asXML();

    echo $retXML;
} 


※どのように出力しているか分からないので最後にechoしてますが、その部分は自身のコードにあわせてください。
※$siteURLや$publicSiteMapについても同様に自身の設定にあわせてください

上記コードの出力結果:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://example.com/search/sample1.html</loc>
    <priority>1.0</priority>
    <changefreq>always</changefreq>
  </url>
  <url>
    <loc>http://example.com/search/sample2.html</loc>
    <priority>0.8</priority>
    <changefreq>daily</changefreq>
  </url>
</urlset>

参考: サイトマップの XML 形式 

追記:
いろいろと置換でなんとかしようとされていますが、改行はおそらく意味がありませんし、SimpleXMLElement には色々と機能があるのでその機能を使ってXMLを生成してください。
オブジェクト操作はオブジェクト機能によって操作しないと思わぬ不具合を起こす可能性もあります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/02 11:23

    おそらく私のコードそのままですよね?
    でしたら問題ないはずですが・・
    ローカル環境では <? でPHPコードと認識されるように設定されているのでしょうか?
    PHPのバージョンや環境構築の仕方により、とは思いますが、
    ひとまず基本どおり <?php で始められては。

    キャンセル

  • 2018/07/02 11:29 編集

    <?phpで修正し直した結果を再度記載します。
    コードがそのまま出てきております

    キャンセル

  • 2018/07/02 11:30

    コードブロック対応失礼しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる