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

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

ただいまの
回答率

90.53%

  • PHP

    20252questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • XML

    651questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

sitemap.xmlの書きだし方変更

解決済

回答 1

投稿 編集

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

emporiol

score 3

 前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    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 06:48

    失礼致します。
    ご回答、さらに迅速な対応ありがとうございます。ただいま作業場所から離れております。後ほど改めて返信致します。
    文字通りの長文乱文で大変失礼致しました。丁寧な対応感謝致します。

    キャンセル

  • 2018/07/02 06:51

    その事情も別に良いかと。そこで「作業場所から離れてる」となると「最初の至急って何?釣りたいだけ?」と非常に不愉快な気分となり、今後回答がつかなくなりますよ。
    なので、個人の都合が垣間見える補足情報は質問には不要なのです。

    キャンセル

  • 2018/07/02 07:48

    失礼しました。言い方が悪かったです。現在出勤中でパソコンを触れない状況です。
    >>>なので、個人の都合が垣間みえる補足情報は質問には不要なのです。
    なるほど、よくわかりました。
    ご指摘ありがとうございます。

    キャンセル

  • 2018/07/02 08:52 編集

    そうですか。お早い時間に出勤なのですね。ご苦労様です。
    ご自身が確認できる状況になかったら尚更「至急」と書いたところで意味なかったですね(追い詰めるつもりは全くありません)
    それと同じで回答している人も質問を常時確認できるわけではありません。(「サポートセンターではありません」ということです)
    厚意により成り立っているので私も含めてですが、スムーズに解決できるようなやり取りを心がけたいですね。
    ヘルプ、特に質問するときは「質問するときのヒント」は一通り目を通しておいた方が良いです。
    https://teratail.com/help/question-tips

    キャンセル

  • 2018/07/02 09:00 編集

    ごもっともです。また、ヒントをみました。
    >>>作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。
    あなたがそのようなつもりで質問しているのだと他のユーザーから誤解されないように、丁寧な質問を心がけましょう。

    これを見て、完全に私個人の都合の良い身勝手な振舞いになっているなと感じます。
    以後気を付けます。ありがとうございます。

    キャンセル

  • 2018/07/02 09:11

    いえいえ。お互い様だと思うので。
    実際にこれで想定通りになっているかどうかはおそらく実際の環境で動かさないと分からないことでもあるでしょうし、また結果分かったら教えてください。

    キャンセル

  • 2018/07/02 09:15

    承知しました。結果がわかり次第お伝えいたします。
    重ね重ね、失礼な対応をしてしまいました。申し訳ありません。
    先ほどのコード大変助かりました。何とか読解して備えようと思います。

    キャンセル

  • 2018/07/02 11:09

    mts10806さんに組んで頂いたコードをローカルで実行しても上記のような実行結果が表示されません。私のやり方が悪いのだとは思いますが。
    mts10806さんが組まれたコードのみで.phpを作成し、そのURLをchromeに張り付けています。
    何か根本的なものを見落としている気がします。

    キャンセル

  • 2018/07/02 11:11

    質問本文に現在のコードを追記していただけますか?

    キャンセル

  • 2018/07/02 11:12 編集

    私はPaizaのEditor( https://paiza.io/ja/projects/new )で変数を任意に設定して組んだので、もしかしたら本ソースの別の兼ね合いもあるかもしれません

    キャンセル

  • 2018/07/02 11:18

    試したこと①に記述しました

    キャンセル

  • 2018/07/02 11:18

    そういったこともあるのですね。。勉強になります。

    キャンセル

  • 2018/07/02 11:18

    すみません。急いで焦ってるのかもしれませんが、コードブロック対応はしてください。
    正しくコピペできないとこちらも正しく再現確認ができません。

    キャンセル

  • 2018/07/02 11:19

    あとこのコードで起きた現象も追記してもらえれば。

    キャンセル

  • 2018/07/02 11:23

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

    キャンセル

  • 2018/07/02 11:29 編集

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

    キャンセル

  • 2018/07/02 11:30

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

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    20252questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • XML

    651questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。