前提・実現したいこと
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/ツールのバージョンなど)
何か情報が足りないとかあるでしょうか?
タイトルには要件のみを書いてください。 https://teratail.com/help/question-tips#questionTips3-1 急いでいるかどうか見ている人には関係ありません。teratailはサポートセンターではないのでその辺りは認識してください。
再現確認しようとした場合、コード以外のものが入っているとそこを削らなければなりません。コードそのものではないのでしたらコードブロックをわけてください。
失礼しました。即修正いたします。
率直に質問です。>>>再現確認しようとした場合、コード以外のものが入っているとそこを削らなければなりません。コードそのものではないのでしたらコードブロックをわけてください。というのは具体的にどういったことでしょうか?
if 閉じられていないようですが、これは?
現在の出力状況、出力変更例 これはコードそのものではありませんよね。コードブロックにはコピー機能がついていますが、左記のものまでついてきてしまうと削るなどしないと再現確認がとれません。ただ、見ている人が勝手に削るのは良くありません(必要なものまで削るおそれもあり、回答者の都合で削るべきではありません)。なので、コードだけをまず提示し、出力結果などは別のコードブロックで補足の情報を囲うようにしてください。見やすい質問は質問から回答・解決までを早めます。急いでいる時こそ質問内容の充実と表現は丁寧にすべきと思います。
$publicSiteMap の内容が分からないので再現確認難しいですね。 var_export()の内容も追記していただけますか?
ifの件大変失礼しました。漏れておりました。
回答のためには情報が足りないので、その後の私のコメントも読んで、追記してください。
細かくて申し訳ないですが【至急】の件は質問本文でも同じですよ。見ている人にとってはノイズでしかないのでやめていただきたく。
仰る通りです。こちら側からの身勝手な文章となっておりました。申し訳ありません。
$publicSiteMap[] = $siteURL."/search/sample1.html";
$publicSiteMap[] = $siteURL."/search/sample2.html";
$publicSiteMap[] = $siteURL."/search/sample3.html";
$publicSiteMap[] = $siteURL."/search/sample4.html";
...となっております。
var_export()はありません。
代わりになるかわかりませんが、下記を追記いたします。 /****** 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
至急は取り消します。丁寧な対応ありがとうございます!
「わける」はそうではないです。```[改行]~~~ ```[改行] が1ブロックですがそのブロック自体をわけてくださいということです。コードブロック右上の「+」ボタンを押すとそのブロック内の全てのテキストがコピーされます。その際に今の状況だとコード以外の情報もコピーされてしまいます。 あと私の書き方が悪かったのですが、 $publicSiteMap は配列ですよね。その内容がどのようになっているか知りたいので、 var_export($publicSiteMap); のように記載して実行して、その出力結果を教えていただきたかったのです。今のように設定している場所でも構いませんが、その情報も質問に追記してください。このコメント欄はデフォルトでは非表示になっているため、他の回答者の目につきにくいです。
「わける」が理解できました。これから気を付けます。
私のほうも言葉不足失礼しました。
申し訳ありません。 var_export($publicSiteMap); のように記載して実行して、その出力結果を教えていただきたかったのです。今のように設定している場所でも構いませんが、とは、下記の記述でよろしかったでしょうか
$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; } }
コメント欄は改行できませんしマークダウンも使えないので、ここにコードを貼るのはやめましょう。
ベストアンサーは良いのですが本当に解決したのでしょうか?特にコードの解説も入れておりませんし、内容を理解されていないと今後困ると思うのですが。
仰る通りです。次回から編集欄に記入致します。
すいません、こういった所に投稿するのも初めてでしたので、タイミングがよくわかりませんでした。
回答1件
あなたの回答
tips
プレビュー