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

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

新規登録して質問してみよう
ただいま回答率
85.48%
XML

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

PHP

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

Q&A

解決済

1回答

1938閲覧

sitemap.xmlの書きだし方変更

emporiol

総合スコア9

XML

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

PHP

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

0グッド

0クリップ

投稿2018/07/01 18:12

編集2018/07/02 02:27

前提・実現したいこと

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

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

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

該当のソースコード

php

1 2////現在のコード 3 4 $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" ?>'.'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>'); 5 6 // xmlノード追加(記事・マンスリー) 7 if(count($publicSiteMap) > 0) { 8 foreach($publicSiteMap as $val) { 9 $xmla = $xml->addChild('url'); 10 $xmla->addChild('loc',$val); 11 12 } 13} 14 $retXML = $xml->asXML(); 15 $retXML = str_replace( "<url><loc><priority><changefreq>" , "\n<url><loc><priority><changefreq>" , $retXML ); 16 $retXML = str_replace( "</urlset>" , "\n</urlset>" , $retXML ); 17 18 /****** xmlファイルの書き出し*****/ 19 $createFile = 'sitemap.xml'; 20 $putFileName = $docRoot."/".$createFile; 21 22 file_put_contents ($putFileName, $retXML); 23 24 mysql_close($con); 25 26 $mess = "抽出バッチ終了時刻2:".date('Y,m/d H:i:s'); 27 echo $mess; 28 //バッチ起動履歴ログ 29 $log -> writeLog2($mess); 30 31 32 33 34function getDirFiles($tar,$match) 35{ 36 37 if ($handle = opendir($tar)) 38 { 39 while (false !== ($file = readdir($handle))) 40 { 41 //echo $file."<br>"; 42 43 if ('.' == $file || '..' == $file)// 自分自身と上位ディレクトリを除外 44 { 45 continue; 46 }// if 47 48//echo preg_match($match, $file)."<br>"; 49 50 51 //ファイル名パターンにマッチしない場合除外 52 if (!preg_match($match, $file)) { 53 continue; 54 } 55 56 /***** 制御文字、日本語文字処理 *****/ 57 58 // 制御文字置換 59 $file00 = htmlspecialchars($file); 60 // 日本語対策 UTF-8へコード変換 61 $file01 = mb_convert_encoding($file00, 'UTF-8','HTML-ENTITIES,ASCII,JIS, EUC-JP, SJIS'); 62 63 //ファイル名取得 64 $filename[] = $file01; 65 66 //サイトマップ公開記事(仕事詳細) 67 //$publicSiteMap[] = $siteURL."/contents/montly/".$filename; 68 69 } //while 70 71 closedir($handle); // ディレクトリハンドルを閉じる 72 73 return $filename; 74 75 } //if 76}//function 77 78 79
//現在の出力状況 <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/ツールのバージョンなど)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/01 20:41

再現確認しようとした場合、コード以外のものが入っているとそこを削らなければなりません。コードそのものではないのでしたらコードブロックをわけてください。
emporiol

2018/07/01 20:45

失礼しました。即修正いたします。
emporiol

2018/07/01 20:49

率直に質問です。>>>再現確認しようとした場合、コード以外のものが入っているとそこを削らなければなりません。コードそのものではないのでしたらコードブロックをわけてください。というのは具体的にどういったことでしょうか?
m.ts10806

2018/07/01 20:49

if 閉じられていないようですが、これは?
m.ts10806

2018/07/01 20:53

現在の出力状況、出力変更例  これはコードそのものではありませんよね。コードブロックにはコピー機能がついていますが、左記のものまでついてきてしまうと削るなどしないと再現確認がとれません。ただ、見ている人が勝手に削るのは良くありません(必要なものまで削るおそれもあり、回答者の都合で削るべきではありません)。なので、コードだけをまず提示し、出力結果などは別のコードブロックで補足の情報を囲うようにしてください。見やすい質問は質問から回答・解決までを早めます。急いでいる時こそ質問内容の充実と表現は丁寧にすべきと思います。
m.ts10806

2018/07/01 20:55

$publicSiteMap の内容が分からないので再現確認難しいですね。 var_export()の内容も追記していただけますか?
emporiol

2018/07/01 21:02

ifの件大変失礼しました。漏れておりました。
m.ts10806

2018/07/01 21:03

回答のためには情報が足りないので、その後の私のコメントも読んで、追記してください。
m.ts10806

2018/07/01 21:06

細かくて申し訳ないですが【至急】の件は質問本文でも同じですよ。見ている人にとってはノイズでしかないのでやめていただきたく。
emporiol

2018/07/01 21:11 編集

仰る通りです。こちら側からの身勝手な文章となっておりました。申し訳ありません。 $publicSiteMap[] = $siteURL."/search/sample1.html"; $publicSiteMap[] = $siteURL."/search/sample2.html"; $publicSiteMap[] = $siteURL."/search/sample3.html"; $publicSiteMap[] = $siteURL."/search/sample4.html"; ...となっております。 var_export()はありません。
emporiol

2018/07/01 21:14

代わりになるかわかりませんが、下記を追記いたします。 /****** 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/monthly/".$filename; } //while closedir($handle); // ディレクトリハンドルを閉じる return $filename; } //if }//function
emporiol

2018/07/01 21:16

至急は取り消します。丁寧な対応ありがとうございます!
m.ts10806

2018/07/01 21:18 編集

「わける」はそうではないです。```[改行]~~~ ```[改行] が1ブロックですがそのブロック自体をわけてくださいということです。コードブロック右上の「+」ボタンを押すとそのブロック内の全てのテキストがコピーされます。その際に今の状況だとコード以外の情報もコピーされてしまいます。 あと私の書き方が悪かったのですが、 $publicSiteMap は配列ですよね。その内容がどのようになっているか知りたいので、 var_export($publicSiteMap); のように記載して実行して、その出力結果を教えていただきたかったのです。今のように設定している場所でも構いませんが、その情報も質問に追記してください。このコメント欄はデフォルトでは非表示になっているため、他の回答者の目につきにくいです。
emporiol

2018/07/01 21:26

「わける」が理解できました。これから気を付けます。
m.ts10806

2018/07/01 21:33

私のほうも言葉不足失礼しました。
emporiol

2018/07/01 21:34

申し訳ありません。 var_export($publicSiteMap); のように記載して実行して、その出力結果を教えていただきたかったのです。今のように設定している場所でも構いませんが、とは、下記の記述でよろしかったでしょうか
emporiol

2018/07/01 21:34

$publicSiteMap[] = $siteURL . "/"; // 公開求人記事 START -------------// //記事のID,企画区分取得 $sql = " select tbp.PLANID ,tbp.GOODSKBN from wPublishOrder wp inner join tBasicPlan tbp on wp.PLANID = tbp.PLANID "; $res = mysql_query($sql, $con); while( $row = mysql_fetch_array($res) ){ $planid[] = $row["PLANID"]; $kubun[] = $row["GOODSKBN"]; } //URL整形 for( $i = 0; $i < count( $planid ); $i++ ){ if($kubun[$i] == '1') { $k = '01'; } else if($kubun[$i] == '2') { $k = '02'; } else if($kubun[$i] == '3') { $k = '03'; } //サイトマップ公開記事(仕事詳細) $publicSiteMap[] = $siteURL."/jobinfo/".$planid[$i]."/".$k.".html"; } echo '公開記事 '.count($planid).'件<br>'; // 公開求人記事 END -------------// // ジョブガイド記事 START -------------// // ジョブガイドコンテンツファイル取得 $dir = dirname(__FILE__) . "/../contents/jobguide"; $regex = "/^(\d{2}.php)|(index.php\z)$/"; //ファイル取得 $ret = getDirFiles($dir,$regex); //ファイル名01.html~30.html昇順 sort($ret); if(count($ret) > 0) { foreach($ret as $val) { //サイトマップ公開記事(仕事詳細) $publicSiteMap[] = $siteURL."/contents/jobguide/".$val; } } // ジョブガイド記事 END -------------// // マンスリー記事 START -------------// // montylyコンテンツファイル取得 $dir = dirname(__FILE__) . "/../contents/monthly"; $regex = "/^(\d{8}.php\z)|(pickup+\d{2}.php\z)|(lab+\d{5}.php\z)|(index.php\z)$/"; //ファイル取得 $ret = getDirFiles($dir,$regex); //ファイル名昇順 sort($ret); if(count($ret) > 0) { foreach($ret as $val) { //サイトマップ公開記事(マンスリー) $publicSiteMap[] = $siteURL."/contents/monthly/".$val; } }
m.ts10806

2018/07/01 21:42

コメント欄は改行できませんしマークダウンも使えないので、ここにコードを貼るのはやめましょう。
m.ts10806

2018/07/01 22:41

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

2018/07/01 22:49

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

2018/07/01 22:51

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

回答1

0

ベストアンサー

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

php

1$siteURL = "http://example.com"; 2$changefreqs =[0=>"always", 3 1=>"hourly", 4 2=>"daily", 5 3=>"weekly", 6 4=>"monthly", 7 5=>"yearly", 8 6=>"never"]; 9 10$publicSiteMap[] = ["loc"=>$siteURL . "/search/sample1.html","priority"=>"1.0","changefreq"=>0]; 11$publicSiteMap[] = ["loc"=>$siteURL . "/search/sample2.html","priority"=>"0.8","changefreq"=>2]; 12 13$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" ?>' . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>'); 14 15// xmlノード追加(記事・マンスリー) 16if (count($publicSiteMap) > 0) { 17 foreach ($publicSiteMap as $map) { 18 $xmla = $xml->addChild('url'); 19 foreach($map as $mapkey=>$mapvalue){ 20 if($mapkey === "changefreq"){ 21 $xmla->addChild($mapkey, $changefreqs[$mapvalue]); 22 }else{ 23 $xmla->addChild($mapkey, $mapvalue); 24 } 25 } 26 } 27 28 $retXML = $xml->asXML(); 29 30 echo $retXML; 31}

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

上記コードの出力結果:

xml

1<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 2 <url> 3 <loc>http://example.com/search/sample1.html</loc> 4 <priority>1.0</priority> 5 <changefreq>always</changefreq> 6 </url> 7 <url> 8 <loc>http://example.com/search/sample2.html</loc> 9 <priority>0.8</priority> 10 <changefreq>daily</changefreq> 11 </url> 12</urlset> 13

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

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

投稿2018/07/01 21:41

編集2018/07/01 21:48
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

emporiol

2018/07/01 21:48

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

2018/07/01 21:51

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

2018/07/01 22:48

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

2018/07/01 23:53 編集

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

2018/07/02 00:38 編集

ごもっともです。また、ヒントをみました。 >>>作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。 あなたがそのようなつもりで質問しているのだと他のユーザーから誤解されないように、丁寧な質問を心がけましょう。 これを見て、完全に私個人の都合の良い身勝手な振舞いになっているなと感じます。 以後気を付けます。ありがとうございます。
m.ts10806

2018/07/02 00:11

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

2018/07/02 00:15

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

2018/07/02 02:09

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

2018/07/02 02:11

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

2018/07/02 02:13 編集

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

2018/07/02 02:18

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

2018/07/02 02:18

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

2018/07/02 02:18

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

2018/07/02 02:19

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

2018/07/02 02:23

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

2018/07/02 02:30 編集

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

2018/07/02 02:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問