♠
Page No.1
WordPress が 6.0 にバージョンアップした時に、お世話になっていた Google XML Sitemap プラグインがエラーを出すようになってしまった。ほどなくそちらもバージョンアップがなされてエラーはでなくなったが、Notice はまだ残ってしまっていた。Notice やら Deprecated は表示されないようにして、気にしないようにする、というのも一つの方法なのかもしれないけれど、いかんせん、自分でプログラムを書く側にいると、どうにも知らぬ顔ができないのが悲しいかな。
こうなるともはや自作するしかないという決断にいたり、プラグインの使用をやめてしまうこととなる。使うのをやめてしまってからもう一度アップデートがあったので、たぶん、すでに Notice も出ないように修正されたのではないだろうか。
自サイトにおいてはパーマリンクの設定をデフォルトのまま変えていない。その場合、WordPress は XML-Sitemap 、robots.txt の面倒をみてはくれず、アクセスしても知らぬ顔をきめこむばかり。まぁ、パーマリンクの設定もしない(必要ない)サイトには、そういったものは不必要だろう、ということなのだろう。
どこかで見たのだと思うが、たしか WordPress が標準で備えている XML-Sitemap 生成機能は、リストしたくないページの設定などはできなかったのではあるまいか。もし、そうだとすると、なんにしても自分的には、結局使えない機能だったのだと思う。
改めて考えてみると、サイトの構成においては、独自の方法でページを分割して複数ページにしているものもあり、taxonomy による独自の方法での画像一覧ページなども多量にあるので、そのあたりはサイト固有の形式であり、やはり汎用の sitemap システムではカバーできない部分があまりにも多いように思える。今まで、あまり気にもせず、Google XML Sitemap プラグインに任せっきりであったけれど、よくよく考えてみると半分もリストされていなかったのではないだろうか(しっかり、確認したこともなかったりして・・・)。まぁ、検索結果などということにも、あまり執着していなかったというのがほんとのところなんだけれど。
XML-Sitemap の書式自体は実にシンプルなものである。 詳しくはこちらをご覧あれ -> 「 Sitemaps.org – サイトマップの XML 形式 」 上記サイトから拝借してきた基本的なパターンは下のとおり。
XML-Sitemap を設置するサイトにおいて、検索エンジンにインデックスさせたいページを、<url> タグでリストすればいいという、シンプルなものである。なお、googlebot においては、<changefreq> と <priority> タグに関しては無視されるとのこと。 書式自体はシンプルなものであるけれど、いざ、WordPress においての投稿ページを書き出すというと、なかなか、そんなに単純なことでもなさそうである。
まずは固定ページ。そして通常の投稿ページがあり、それに伴うカテゴリーや投稿タグのページもあるし、別のアーカイブもあるかも。そのうえ、それぞれにページネーションされてページが複数になっているということも。まだまだある・・・、カスタム投稿があれば、それもそれぞれに個別ページやらアーカイブページなどがあるわけで。と、なかなかに面倒なことが待ち受けているようである。
必要な情報としては、各投稿のリンク先と post_modified( 更新日時)。固定ページと全ての投稿タイプの投稿の情報をデータベースから取得する。あとは、 category や post_tag、各カスタムタクソノミーのリンク先と、ページが複数になっている可能性があるのでそれぞれに登録されている投稿数が必要ということか。<changefreq> タグにおいては適当な値を設定するとして、<priority> においてはそれぞれのページにおいての値を設定する必要があると思われるので、その値は WordPress の option 値としてデータベースに保存できるようにし、管理画面のメニューにページを追加してそのページにおいて sitemap の作成を含め操作できるようにした。
まずは、管理画面のメニューに項目を追加して、そのページを表示できるようにする処理。これはお約束のきまった書式でただ登録するだけのこと。詳しくはここを -> 「wordpress管理画面にテーマのオプション設定ページを表示 」。もう、ちょっと古くなっているので、新しい情報があるのかも。でも、今でもこのままで有効だった。といいつつ、他でいろいろと現役で使いまわしているのだから当然のことである。
そして、オプション値の取得に関する関数。普通に取得するだけなら、get_option を普通に使うだけだけれど、作成中にオプション値を増やしたり減らしたりするものだからこういう関数にしてる。なんとかとにかく少しでも負荷を少なくしたいということで、いろいろやっていて、今のところこれになってる。
つづいて、中核となる、管理画面に表示させるべく add_options_page() 関数に登録した、実際に表示させるページの中身となる generate_xml_sitemap() 関数。
<?php
function generate_xml_sitemap ( ) {
$ sitemap = 'sitemap.xml' ;
$ sitemappath = ABSPATH . $ sitemap ;
$ ajax_nonce = wp_create_nonce ( __FILE__ ) ;
$ options_name = 'sitemap_options' ;
$ sitemap_dft_options = array (
'pages_ignore' => [ '' , 'post_type -> page でsitemap にリストしない無視する post->ID。"," 区切り。<br>default:164284,118534,78381,70152,39776,27498,48' ] ,
'pages_priority' => [ '' , 'post_type -> page でリストするもののpriority設定。ID:値 で "," 区切り。<br>default:31002:0.7,26870:0.7,24452:0.8,16227:0.9<br>指定なしは 0.5' ] ,
'gulls_wing_priority' => [ '0.9' , 'Gulls Wing-tip Patterns page の priority、default 0.9' ] ,
'gulls_wlist_priority' => [ '0.8' , 'Gulls Wing-tip Patterns list page の priority、default 0.8' ] ,
'diy_priority' => [ '0.8' , 'post_type diys 関連ページの priority、default 0.8' ] ,
'gulls_priority' => [ '0.8' , 'post_type gulls シングルページの priority、default 0.8' ] ,
'blues_priority' => [ '0.8' , 'post_type blues 関連ページの priority、default 0.8' ] ,
'standard_priority' => [ '0.5' , '設定のないページのデフォルト priority、default 0.5' ] ,
'category_priority' => [ '0.7' , 'category taxonomy の priority、default 0.7' ] ,
'tag_priority' => [ '0.7' , 'post_tag taxonomy の priority、default 0.7' ] ,
'gull_tax_priority' => [ '0.7' , 'gull taxonomy の priority、default 0.7' ] ,
) ;
$ dft_options = array ( ) ;
foreach ( $ sitemap_dft_options as $ key => $ val ) {
$ dft_options [ $ key ] = $ val [ 0 ] ;
}
$ is_dev_mode = 1 ;
$ { $ options_name } = current_option_check ( $ options_name , $ dft_options , $ is_dev_mode ) ;
if ( ! $ sitemap_options ) {
exit ;
}
?>
< div class = " wrap" id = " custom-logo" style = " padding : 10 px ; font-size : 18 px ; letter-spacing : 1.5 px ; border-radius : 10 px ; background : white ; " >
< h2> Generate XML-Sitemap</ h2>
< h3> Priority option config</ h3>
< form name = " sitemapoptions" >
< table class = " options-table" >
< tr> < th> option</ th> < th> value</ th> < th> explain</ th> </ tr>
<?php
foreach ( $ sitemap_options as $ key => $ val ) {
echo '<tr><td>' . $ key . '</td><td><input type="text" name="' . $ key . '" value="' . $ val . '"></td><td>' . $ sitemap_dft_options [ $ key ] [ 1 ] . '</td></tr>' ;
}
?>
</ table>
</ form>
< p id = " updateres" > < button id = " optionupdate" style = " padding : 5 px ; color : blue ; border : solid 1 px blue ; background : linear-gradient ( #f2f4f4 , white , #f2f4f4 ) ; border-radius : 5 px ; box-shadow : 2 px 2 px 2 px rgba ( 0 , 0 , 0 , 0.3 ) ; cursor : pointer; " > Option Update</ button> </ p>
</ div>
< div id = " xmlsitemap" >
<?php
if ( file_exists ( $ sitemappath ) ) {
echo '<p>Already XML-Sitemap exist.</p>' ;
echo '<p>Open <a href="' . site_url ( ) . '/' . $ sitemap . '" target="_blank" rel="noopener noreferrer">XML-Sitemap</a> another tab.</p>' ;
} else {
echo '<p>XML-Sitemap.xml url : ' . site_url ( ) . '/' . $ sitemap . '<p>' ;
echo '<p>XML-Sitemap none yet.</p>' ;
}
?>
< p> Generate new XML-Sitemap < button id = " genesitemap" style = " padding : 5 px ; color : blue ; border : solid 1 px blue ; background : linear-gradient ( #f2f4f4 , white , #f2f4f4 ) ; border-radius : 5 px ; box-shadow : 2 px 2 px 2 px rgba ( 0 , 0 , 0 , 0.3 ) ; cursor : pointer; " > Generate</ button> </ p>
< div id = " genewait" > </ div>
< p id = " genesmresult" > </ p>
< div id = " waitback" style = " display : flex; justify-content : center; align-items : center; position : fixed; width : 100 vw ; height : 100 vh ; top : 0 px ; left : 0 px ; background : rgba ( 0 , 0 , 0 , 0.3 ) ; visibility : hidden; opacity : 0 ; transition : all 0.5 s ; " > < div id = " waiticon" style = " position : relative; width : 100 px ; height : 100 px ; background : url ( <?php echo get_bloginfo ( 'template_url' ) ; ?> /wait_icon.png) no-repeat center / contain; " > </ div> </ div>
</ div>
< script>
( function ( ) {
function ajax_callback ( str, callback, parent = 'genesmresult' ) {
if ( str ) {
const url = '<?php echo site_url ( ) ; ?> /wp-admin/admin-ajax.php' ;
const req= new XMLHttpRequest ( ) ;
req. onreadystatechange = function ( ) {
let result = '' ;
if ( req. readyState == 4 ) {
if ( req. status == 200 ) {
result = req. responseText;
callback ( result ) ;
} else {
resstr = '<p style="color:red;font-size:20px;">error : Disable Ajax send!</p>' ;
document . getElementById ( parent ) . innerHTML = resstr;
}
}
}
req. open ( 'POST' , url, true ) ;
req. setRequestHeader ( 'Content-Type' , 'application/x-www-form-urlencoded' ) ;
req. send ( str ) ;
} else {
console . log ( 'error : no data url' ) ;
}
}
const doc = document ,
target = doc. getElementById ( 'genesitemap' ) ,
oform = doc. forms. sitemapoptions,
ou = doc. getElementById ( 'optionupdate' ) ;
target. onclick = ( ) => {
const nonce = '<?php echo $ ajax_nonce ; ?> ' ,
strsend = 'action=generatesitemap&nonce=' + nonce;
ajax_callback ( strsend, function ( result ) {
if ( - 1 !== result. indexOf ( 'error' ) ) {
resstr = '<p style="color:red;font-size:18px">failed generate sitemap : ' + result + '</p>' ;
} else {
resstr = '<p style="font-size:18px;">Success generate sitemap :<br>' + result + '</p>' ;
}
doc. getElementById ( 'genesmresult' ) . innerHTML = resstr;
} ) ;
return false ;
}
ou. onclick = ( ) => {
const nonce = '<?php echo $ ajax_nonce ; ?> ' ,
parent = 'updateres' ,
ips = oform. elements;
let strsend = 'action=udsitemapopt&nonce=' + nonce;
for ( let i = 0 , ips_len = ips. length ; i < ips_len; ++ i ) {
strsend += '&' + ips[ i ] . name + '=' + ips[ i ] . value;
}
ajax_callback ( strsend, function ( result ) {
if ( - 1 !== result. indexOf ( 'error' ) ) {
resstr = '<p style="color:red;font-size:18px">failed update options : ' + result + '</p>' ;
} else {
resstr = '<p style="color:blue;padding:10px;font-size:18px;border-top:double 4px lime;border-bottom:double 4px lime">' + result + '</p>' ;
}
doc. getElementById ( parent ) . innerHTML = resstr;
} , parent ) ;
return false ;
}
} ) ( ) ;
</ script>
<?php
}
?>
Copy Expand ‹ › ‹ › ‹ › ‹ › ‹ ›
次は、オプションを更新する Ajax で JavaScript から送信されたデータを受けて、実際にデータベースを更新するための php 側の関数。オプションを更新するページの形式には基本となるものがあって、いままではそれにならった形式でやってきたが、今回は Ajax での方法にしてみた。というのは、実際に sitemap を生成する関数もそれ自体がオプション値を取得するようになっているので、オプション更新後のページ再読み込みが必要ないからである。
セキュリティ的には、ログイン状況とそれが管理者であるかの確認と、WordPress の nonce を使ってる。これで十分ではないかと。
そして最後に Ajax で JavaScript から呼ばれて、XML-Sitemap を生成する関数。SQL でデータベースから投稿等の情報を取得して、XML データを生成してファイル sitemap.xml に保存する。投稿の種類とか、taxonomy とかページネーションされた複数のページとか、ちょっとややこしい部分である。 と、そのまえにちょっとデータベースにある日付データを加工するだけの簡単な関数を。ただ、空白以降の時間の文字列を削除して年月日だけにするもの。
そして本丸の generatesitemap() 関数。 実際に XML を出力する部分は、そのサイトが特徴のある部分が多ければ多いほど、それ固有の部分が多くなるだろう。 ログインユーザーチェックのあと、オプションを取得してそのあと SQL で投稿の情報を取得する。 この SQL は投稿と taxonomy を紐づけて taxonomy のあるだけデータを取得するので、同じ投稿がその投稿に紐づけてある taxonomy の分だけ重複しているということになる。ソートは投稿日の逆順なので、ループさせた場合、新しいものほど早く出てくる。
通常の taxonomy 等のアーカイブページは、投稿数が多い場合はページが複数になるわけだけれど、その場合は投稿数がわかりさえすれば、そのページ数を取得するのは簡単なことである。ただ、自サイトの場合ちょっと事情が異なるページが存在する。
それはカスタム投稿 diys のページなのだけれど( 今、表示されているページがその diys である )、このカスタム投稿の個別ページにおいては、ページの表示高速化のために独自キャッシュ化している。キャッシュファイルが存在する場合は、WordPress からの動的な出力ではなく、すでに生成された静的な HTML データをキャッシュファイルから読み込んで表示するようにさせている。その上、コンテンツ量の多いページに関しては、複数のページに分割してキャッシュファイルにしている。
それらのページのページ数を取得するのに、投稿の内容を読み出せば可能ではあるけれど、非常に処理が重くなりそうである。それよりも、同じ投稿 ID のキャッシュファイルの数をしらべる方がよほど手っ取り早く処理も断然軽い。と、いうことでその処理も途中に入っている。複数ある ID のものだけ、それがいくつあるかを取得させている。
処理の流れとしては、データベースから取得したデータを、各投稿別に、 post、page、そしてカスタム投稿の diys、gulls、blues、をそれぞれの配列にまとめて、taxonomy もそのアーカイブページが存在する category、post_tag、gull、においてそれぞれの配列にとりあえずまとめておいて、後で、それぞれがひとかたまりになるように XML の要素として生成させている。
<?php
function generatesitemap ( ) {
if ( ! function_exists ( 'wp_get_current_user' ) ) {
exit ;
}
$ user_id = get_current_user_id ( ) ;
if ( 1 === $ user_id ) {
if ( check_ajax_referer ( __FILE__ , 'nonce' , false ) ) {
global $ wpdb ;
$ sitemap_options = get_option ( 'sitemap_options' ) ;
$ error = '' ;
$ diys_cache_dir = get_template_directory ( ) . '/diy_cache/' ;
$ posts_per_page = get_option ( 'posts_per_page' ) ;
$ sql = << < HERE
SELECT p. ID , p. post_title, p. post_modified, p. post_type, p. post_name, t. term_id, x. taxonomy, t. slug, x. count
FROM $ wpdb -> posts p
LEFT OUTER JOIN $ wpdb -> term_relationships r on p. ID = r. object_id
LEFT OUTER JOIN $ wpdb -> term_taxonomy x on r. term_taxonomy_id = x. term_taxonomy_id
LEFT OUTER JOIN $ wpdb -> terms t on x. term_id = t. term_id
WHERE p. post_status = 'publish'
ORDER BY p. post_modified DESC
HERE ;
$ pt = $ wpdb -> get_results ( $ sql ) ;
$ posts = array ( ) ;
$ pages = array ( ) ;
$ diys = array ( ) ;
$ gulls = array ( ) ;
$ blues = array ( ) ;
$ ptags = array ( ) ;
$ pcats = array ( ) ;
$ gtags = array ( ) ;
$ allposts = array ( ) ;
$ types = array ( 'post' => 'posts' , 'page' => 'pages' , 'diys' => 'diys' , 'gulls' => 'gulls' , 'blues' => 'blues' ) ;
$ post_last_date = '' ;
$ diys_last_date = '' ;
$ gull_last_date = '' ;
$ firstel = array ( 0 , 0 , 0 ) ;
$ pt_count = 0 ;
if ( $ pt ) {
$ pt_count = count ( $ pt ) ;
foreach ( $ pt as $ p ) {
$ ptype = $ p -> post_type ;
if ( isset ( $ types [ $ ptype ] ) ) {
$ { $ types [ $ ptype ] } [ $ p -> ID ] = [ $ p -> post_title , $ p -> post_modified , $ p -> post_name ] ;
}
if ( 'post' === $ ptype ) {
if ( 'category' === $ p -> taxonomy ) {
if ( ! isset ( $ pcats [ $ p -> term_id ] ) ) {
$ pcats [ $ p -> term_id ] = [ $ p -> ID , $ p -> post_modified , $ p -> slug , $ p -> count ] ;
}
} else if ( 'post_tag' === $ p -> taxonomy ) {
if ( ! isset ( $ ptags [ $ p -> term_id ] ) ) {
$ ptags [ $ p -> term_id ] = [ $ p -> ID , $ p -> post_modified , $ p -> slug , $ p -> count ] ;
}
}
if ( 0 === $ firstel [ 0 ] ) {
$ post_last_date = $ p -> post_modified ;
}
++ $ firstel [ 0 ] ;
} else if ( 'gulls' === $ ptype ) {
if ( 'gull' === $ p -> taxonomy ) {
if ( ! isset ( $ gtags [ $ p -> term_id ] ) ) {
$ gtags [ $ p -> term_id ] = [ $ p -> ID , $ p -> post_modified , $ p -> slug , $ p -> count ] ;
}
}
if ( 0 === $ firstel [ 1 ] ) {
$ gull_last_date = $ p -> post_modified ;
}
++ $ firstel [ 1 ] ;
} else if ( 'diys' === $ ptype ) {
if ( 0 === $ firstel [ 2 ] ) {
$ diys_last_date = $ p -> post_modified ;
}
++ $ firstel [ 2 ] ;
}
}
} else {
if ( is_array ( $ pt ) ) {
$ error .= implode ( '<br>' , $ pt ) ;
} else {
$ error .= $ pt ;
}
}
$ pt = null ;
$ diys_cache_pages = array ( ) ;
if ( file_exists ( $ diys_cache_dir ) ) {
$ diy_caches = array_diff ( scandir ( $ diys_cache_dir ) , array ( '..' , '.' ) ) ;
if ( $ diy_caches ) {
foreach ( $ diy_caches as $ val ) {
$ pi = pathinfo ( $ val ) ;
if ( isset ( $ pi [ 'extension' ] ) and 'php' === $ pi [ 'extension' ] ) {
$ el = explode ( '_' , $ pi [ 'filename' ] ) ;
if ( isset ( $ el [ 3 ] ) ) {
if ( isset ( $ diys_cache_pages [ $ el [ 2 ] ] ) ) {
$ diys_cache_pages [ $ el [ 2 ] ] += 1 ;
} else {
$ diys_cache_pages [ $ el [ 2 ] ] = 1 ;
}
}
}
}
}
}
if ( $ error ) {
echo 'failed SQL : ' . $ error ;
} else {
$ xml = array (
'<?xml version="1.0" encoding="UTF-8"?>' . "\n" ,
'<urlset xmlns="https://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" ,
'<url><loc>https://strix.main.jp/</loc><lastmod>' . w3cdt ( $ post_last_date ) . '</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url>' . "\n" ,
) ;
$ url = 'https://strix.main.jp/?' ;
$ pages_ignore = array ( ) ;
if ( $ sitemap_options [ 'pages_ignore' ] ) {
$ tmpel = explode ( ',' , $ sitemap_options [ 'pages_ignore' ] ) ;
foreach ( $ tmpel as $ val ) {
$ pages_ignore [ ( int ) $ val ] = 0 ;
}
}
$ pages_priority = array ( ) ;
if ( $ sitemap_options [ 'pages_priority' ] ) {
$ tmpel = explode ( ',' , $ sitemap_options [ 'pages_priority' ] ) ;
foreach ( $ tmpel as $ val ) {
$ elms = explode ( ':' , $ val ) ;
if ( isset ( $ elms [ 1 ] ) and $ elms [ 0 ] ) {
$ pages_priority [ ( int ) $ elms [ 0 ] ] = $ elms [ 1 ] ;
}
}
}
$ nowdate = new DateTime ( ) ;
$ blues_count = 1 ;
$ posts_count = 0 ;
$ ans = array ( ) ;
$ show_types = array ( 'pages' , 'diys' , 'gulls' , 'blues' , 'posts' ) ;
foreach ( $ show_types as $ val ) {
$ tartype = $ { $ val } ;
if ( $ tartype ) {
$ ans [ ] = $ val . ' : ' . ( string ) count ( $ tartype ) ;
foreach ( $ tartype as $ key => $ value ) {
if ( 'pages' === $ val ) {
if ( 69149 === $ key ) {
$ page_count = ceil ( count ( $ gulls ) / $ posts_per_page ) ;
$ lastmod = w3cdt ( $ gull_last_date ) ;
for ( $ i = 0 ; $ i < $ page_count ; ++ $ i ) {
$ paged = '' ;
if ( $ i > 0 ) {
$ paged = '&paged=' . ( string ) ( $ i + 1 ) ;
}
$ xml [ ] = '<url><loc>' . $ url . 'page_id=' . $ key . $ paged . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>yearly</changefreq><priority>' . $ sitemap_options [ 'gulls_wing_priority' ] . '</priority></url>' . "\n" ;
}
} elseif ( 69697 === $ key ) {
$ lastmod = w3cdt ( $ gull_last_date ) ;
for ( $ i = 0 ; $ i < 6 ; ++ $ i ) {
$ paged = '' ;
if ( $ i > 0 ) {
$ paged = '&paged=' . ( string ) ( $ i + 1 ) ;
}
$ xml [ ] = '<url><loc>' . $ url . 'page_id=' . $ key . $ paged . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>yearly</changefreq><priority>' . $ sitemap_options [ 'gulls_wlist_priority' ] . '</priority></url>' . "\n" ;
}
} else {
if ( 46 == $ key ) {
$ lmod = $ post_last_date ;
} elseif ( 16227 === $ key ) {
$ lmod = $ diys_last_date ;
} else {
$ lmod = $ value [ 1 ] ;
}
$ priority = '0.5' ;
if ( isset ( $ pages_priority [ $ key ] ) ) {
$ priority = $ pages_priority [ $ key ] ;
}
if ( ! isset ( $ pages_ignore [ $ key ] ) ) {
$ xml [ ] = '<url><loc>' . $ url . 'page_id=' . $ key . '</loc><lastmod>' . w3cdt ( $ lmod ) . '</lastmod><changefreq>yearly</changefreq><priority>' . $ priority . '</priority></url>' . "\n" ;
}
}
} elseif ( 'diys' === $ val ) {
$ moddate = new DateTime ( $ value [ 1 ] ) ;
$ diff = $ moddate -> diff ( $ nowdate ) ;
$ daydiff = $ diff -> format ( '%a' ) ;
$ priority = $ sitemap_options [ 'diy_priority' ] ;
$ chgfrq = 'yearly' ;
if ( $ daydiff < 10 ) {
$ chgfrq = 'weekly' ;
$ priority = '0.9' ;
} elseif ( $ daydiff < 30 ) {
$ chgfrq = 'monthly' ;
$ priority = '0.8' ;
}
$ lastmod = w3cdt ( $ value [ 1 ] ) ;
$ xml [ ] = '<url><loc>' . $ url . 'diys=' . $ value [ 2 ] . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>' . $ chgfrq . '</changefreq><priority>' . $ priority . '</priority></url>' . "\n" ;
if ( isset ( $ diys_cache_pages [ $ key ] ) ) {
++ $ diys_cache_pages [ $ key ] ;
for ( $ i = $ diys_cache_pages [ $ key ] ; $ i > 1 ; -- $ i ) {
$ xml [ ] = '<url><loc>' . $ url . 'diys=' . $ value [ 2 ] . '&dev=' . ( string ) $ i . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>' . $ chgfrq . '</changefreq><priority>' . $ priority . '</priority></url>' . "\n" ;
}
}
} elseif ( 'gulls' === $ val ) {
$ xml [ ] = '<url><loc>' . $ url . 'gulls=' . $ value [ 2 ] . '</loc><lastmod>' . w3cdt ( $ value [ 1 ] ) . '</lastmod><changefreq>never</changefreq><priority>' . $ sitemap_options [ 'gulls_priority' ] . '</priority></url>' . "\n" ;
} elseif ( 'blues' === $ val ) {
if ( 1 === $ blues_count ) {
$ xml [ ] = '<url><loc>' . $ url . 'post_type=blues</loc><lastmod>' . w3cdt ( $ value [ 1 ] ) . '</lastmod><changefreq>yearly</changefreq><priority>' . $ sitemap_options [ 'blues_priority' ] . '</priority></url>' . "\n" ;
}
$ xml [ ] = '<url><loc>' . $ url . 'blues=' . $ value [ 2 ] . '</loc><lastmod>' . w3cdt ( $ value [ 1 ] ) . '</lastmod><changefreq>never</changefreq><priority>' . $ sitemap_options [ 'blues_priority' ] . '</priority></url>' . "\n" ;
++ $ blues_count ;
} else {
$ xml [ ] = '<url><loc>' . $ url . 'p=' . $ key . '</loc><lastmod>' . w3cdt ( $ value [ 1 ] ) . '</lastmod><changefreq>never</changefreq><priority>' . $ sitemap_options [ 'standard_priority' ] . '</priority></url>' . "\n" ;
++ $ posts_count ;
}
}
}
}
$ rooptar = array ( 'category' => 'pcats' , 'post_tag' => 'ptags' , 'gull' => 'gtags' ) ;
foreach ( $ rooptar as $ key => $ tax ) {
$ tartax = $ { $ tax } ;
if ( $ tartax ) {
$ ans [ ] = $ key . ' : ' . ( string ) count ( $ tartax ) ;
foreach ( $ tartax as $ key => $ row ) {
$ lmod = $ row [ 1 ] ;
$ lastmod = w3cdt ( $ lmod ) ;
$ target = array ( 'pcats' => [ 'cat=' . ( string ) $ key , 'z' . $ row [ 2 ] ] , 'ptags' => [ 'tag=' . $ row [ 2 ] , 'x' . $ row [ 2 ] ] , 'gtags' => [ 'gull=' . $ row [ 2 ] ] ) ;
$ xml [ ] = '<url><loc>' . $ url . $ target [ $ tax ] [ 0 ] . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>yearly</changefreq><priority>0.7</priority></url>' . "\n" ;
$ pcount = ceil ( $ row [ 3 ] / $ posts_per_page ) ;
if ( $ pcount > 1 ) {
++ $ pcount ;
for ( $ i = 2 ; $ i < $ pcount ; ++ $ i ) {
$ xml [ ] = '<url><loc>' . $ url . $ target [ $ tax ] [ 0 ] . '&paged=' . ( string ) $ i . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>yearly</changefreq><priority>0.7</priority></url>' . "\n" ;
}
}
if ( 'gtags' === $ tax ) {
$ xml [ ] = '<url><loc>' . $ url . 'page_id=69697&' . $ target [ $ tax ] [ 0 ] . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>yearly</changefreq><priority>0.7</priority></url>' . "\n" ;
} else {
$ xml [ ] = '<url><loc>' . $ url . 'page_id=48&tagname=' . $ target [ $ tax ] [ 1 ] . '</loc><lastmod>' . $ lastmod . '</lastmod><changefreq>yearly</changefreq><priority>0.7</priority></url>' . "\n" ;
}
}
}
}
$ xml [ ] = '<url><loc>https://strix.main.jp/canus/</loc><lastmod>2017-10-04</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>' . "\n" ;
$ xml [ ] = '</urlset>' ;
$ fh = fopen ( ABSPATH . 'sitemap.xml' , 'w' ) ;
if ( $ fh ) {
fwrite ( $ fh , implode ( '' , $ xml ) ) ;
fclose ( $ fh ) ;
} else {
echo 'error: Disable open xml file.' ;
}
echo 'All posts : ' . $ pt_count . '<br>' . implode ( '<br>' , $ ans ) . '<br>xml objects count : ' . ( count ( $ xml ) - 3 ) ;
}
} else {
echo 'error: Access denied.' ;
}
} elseif ( 0 === $ user_id ) {
echo 'error:none log-in' ;
} else {
echo 'error! log-in not admin : ' . $ user_id ;
}
exit ;
}
add_action ( 'wp_ajax_generatesitemap' , 'generatesitemap' ) ;
?>
Copy Expand ‹ › ‹ › ‹ › ‹ › ‹ › ‹ › ‹ › ‹ › ‹ › ‹ ›
これでおわりである。 とりあえず、これで XML-Sitemap にはこまらなくてすみそうではあるのだけれど・・・。まぁ、ただ、新規投稿した場合の sitemap 更新は手動である。検索エンジンへの通知もなし。 と、いうことでさっそく Google と Bing に新しい XML-Sitemap の url を送信した。が、Google Search Console が新 sitemap を読み込んでくれない。Bing の方は送信すると同時に読んでくれたのだけれど。二、三日様子を見ていても読んでくれないので、robots.txt も自作して設置してみたが、今のところ改善されない。これはいったい・・・? あれま、散々ないがしろにしていたから意地悪されているのかしら?どうしたものか!
実は、プログラムに二度手間な部分を見つけ(投稿カウント 0 のカテゴリーページがリストされていたりもした)、それを直して(上に掲載しているのは訂正したもの)再び送信してみたが結果に変化はなし。何度も送信するのも問題がありそうなので、それはやめてちょっと様子を見ているしか無いなと。
話はちょっとそれるが、このプログラムを初めてサーバーにアップさせて動かした時に、SQL において、必要もないのに prepare を使っていて Notice をもらってしまった。これ、Google XML Sitemap プラグインで出ていた Notice と全く同じもの。はは・・・、ちょっと親しみを感じてしまった。
確か、prepare を使ったほうがより高速だったと記憶しているが、それは同じ SQL を二度、三度と使った時のことで、一度しか使わないのであればそのアドバンテージはなかったのだと思う。
話を戻して、様子を見つつ、なにかできることはないのだろうかとネットを徘徊などしていた。インデックスファイルを作って、いくつかのファイルに分割したほうが良いのか、など考えもしたが。一つ気がついたのは、Google Search Console を使い始めてすでに随分と時間が経っているが、その間、サイトにもかなり手をいれていたので、いつの間にか、GSC の認識用のタグがなくなってしまっていた。なので、改めてその meta タグを入れて確認させた。
それが功を奏したというわけでもないのだろうけれど、最後に送信してから4日後にめでたく読み込んでくれた。ただ単に、送信すればすぐに読み込んでくれるわけではない(そう言うことが書いてあったとも思う)、ということなのだろうけれど、それならそれで表示される文言が、「読み込まれるまでしばらくお待ち下さい」とかだったら、じたばたすることなく待てるように思えるのではあるけれど。
とにかく、ボットさんにはボットさんの都合というものがあるということで。 ちなみに、サイトマップを読み込んでくれた後、クローラのアクセス回数がどっと増えたので、読み込んでくれたのは間違いないようである。 しかし、これで終わりかと思いきや、実はまだまだつづくのである。
page : 1 > 2 3 ☆このページはコンテンツの量が多いので分割しています
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=171038