新茂原駅の南の神林踏切近く。

黄色のちかん看板。下の「注意」の文字が日焼けで見えなくなっています。

新茂原駅前。こちらの看板も「多発注意!!」の部分が日焼けしています。

朝日神社の近く。下の部分「に注意」が、見えなくなっています。

塗料の色によって日焼けの進行に差があるようです。※1
新茂原駅の南の神林踏切近く。
黄色のちかん看板。下の「注意」の文字が日焼けで見えなくなっています。
新茂原駅前。こちらの看板も「多発注意!!」の部分が日焼けしています。
朝日神社の近く。下の部分「に注意」が、見えなくなっています。
塗料の色によって日焼けの進行に差があるようです。※1
新茂原駅前の通り沿いには、飲食店が散在しています。
すし、天ぷら、うなぎの辰巳屋。
ランチメニューもあります。
ちらし寿司とビールを注文。
今回は、茂原(千葉県茂原市)の町並みを散歩します。
外房線茂原駅の一つ手前の新茂原駅。
改札口へ。
紺地に白文字で書かれたホーロー駅名標。近年は姿を見かけなくなってきましたが、綺麗な状態で残っています。
駅舎もレトロな雰囲気です。
布田駅近く。旧甲州街道沿いにある常性寺。
境内の西側手前の隅に、「敷石碑」が建っています。
これは、五宿の貸座敷業の主人が、明治11年、境内の敷石を寄付した記念碑です。※1
「五宿貸座敷」。
五宿貸座敷の主人20名の名が刻まれています。*1
1865年、幕府は長州征伐を行ない、布田五宿に対し、軍用金5000両の献上を要求しましたが、五宿は、飯盛り旅籠の設置の許可を願い出、飯盛旅籠が認められれば、7000両の冥加金を上納することを申し出ました。その結果、1866年 7月以前には布田五宿に飯盛旅籠が許可されました。その後、貸座敷業者は、1875年には17件を数え、さらに1877年には21軒に増加しましたが、その後は衰退しました。※2
この「敷石碑」は、布田の貸座敷が全盛期のものといえます。
P.265
国領二丁目から一丁目に入ると、右手に常性寺がある。境内隅には敷石…
P.73
甲州街道筋では、内藤新宿、高井戸、府中、八王子が飯盛女を置いていた…
調布駅北側の商店街「調布銀座」にある台北飯店。
台北飯店は、ウルトラセブンにアンヌ隊員役として出演したひし美ゆり子さんが経営されている店です。※1
ランチメニューは種類が豊富です。
チャーハン・スープ餃子とビールを注文。
アンヌ隊員は、セブンファンだけではなく、多くの人々にとって永遠のあこがれです。※1
調布駅の北側。旧甲州街道沿いにある名糖牛乳宮川販売店。
名糖牛乳のマーク。
名糖牛乳の商品が並んでいます。
横から見ると、看板建築であることが解ります。
調布駅の北、武蔵野の森公園。
園内に掩体壕の遺構が残されています。
戦闘機「飛燕」のモニュメント。
「飛燕」は、第2次世界大戦中、川崎航空機工業(現在の川崎重工業)が製作した戦闘機で、唯一の水冷式戦闘機として開発され、最大速度610km/時、高度1万メートルでも編隊飛行が可能であるなど、当時の世界水準をいく高性能機でした。※1
掩体壕の前面は、ふさがれていますが、そこには、「飛燕」が描かれています。
調布駅前公園は昭和47(1972)年に開園し、タコのすべり台があったことから「タコ公園」として親しまれてきましたが、京王線の地下化に伴う駅前広場や地下駐輪場などの整備のため、平成28(2016)年9月30日に閉園しました。*1
現在の「タコ公園(通称)」は、令和2(2020)年4月、調布市役所裏の京王相模原線の跡地に、鉄道敷地公園(仮称)が開園したもので、ここに、かつてのタコ公園のシンボルだった「タコのすべり台」が再建されました。*1
多くの市民からの復活の要望を受け、先代のタコの頭の一部が現在のタコの頭に埋め込まれているそうです。*1
すべり台は、迫力満点です。
桜堤通り沿いにある日活調布撮影所。近くには、多摩川自然観察緑地があって、水と緑の環境に恵まれた場所です。
撮影所の建物の東隣(写真右手前の塀のある場所)に、ぬのた公園への通り抜け通路の入口があります。
曲がりくねった通路を進むと、調布市立ぬの多公園への敷。(写真中央)地につながっていますが、この場所に小さな石碑があります
日活撮影所の碑。日活映画全盛時代を象徴する石碑です。
説明文によると、撮影所ができた頃は、周囲に住宅は無く、田園風景が広がっていたそうです。
1962年には銀座の並木通りとみゆき通り等の町並みを再現したオープンセットが完成し、同年3月公開の「銀座の恋の物語」「上を向いて歩こう」で使用されたそうです。
今回は、調布(東京都調布市)の町並みを散歩します。
多摩川5丁目の「角川大映スタジオ」(写真の左奥に見える建物)の近くに映画俳優之碑があります。
昭和の映画界を代表する俳優の名前が刻まれています。
映画俳優之碑のすぐ近く。多摩川5丁目児童遊園の敷地内には、調布映画発祥の碑。
碑の説明文によると、昭和8年1月、この地(調布市多摩川)の「水と緑と澄んだ空気」が映画産業に欠かすことのできない条件であったことから、最適地に選ばれ、日本映画株式会社が設立され、多摩川スタジオが完成したそうです。
吉原弁財天のお堂※1 の中に掲げられている奉納額。
当時の店舗の屋号が解る貴重な資料です。
額の左側は、料亭などの店舗の名が連なっています。
昭和30年3月、発起人は「水常」と記されています。
吉原弁財天の花吉原名残碑のあるあたり。最近、。椅子とテーブルが設置され、ここで、ゆっくりとできるようになりました。
テーブル近くにある「大震火災十週年記念月桂樹」の碑。※1
昭和7(1932)年3月に、水常楼の伊藤常吉が寄進しています。
月桂樹。
吉原弁財天の入口にある水常楼伊藤常吉が寄進玉垣。その大きさから、吉原の実力者であったことが解ります。
「水常」と刻まれた石柱が建つあたりには、さまざま石碑が密集しています。水常楼伊藤常吉が関係している石碑群と思われます。
奥にある吉原講の石碑。
伊藤常吉は、吉原を仕切った大物で、大雄山二十一丁目星宿燈を建てました。*1※1
十七回忌追善碑。※2
発起人に、伊藤常吉の名があります。
参廿一丁目の水常楼伊藤常吉は三業組合取締役等の公職に着いてはいなかったよう…
桜鍋料理の「中江」※1 や「土手の伊勢屋」※2などの名店が建ち並ぶ土手通り※3※4。
とんかつ専門店の美乃屋。
落ち着ける店内。
かつ丼とビールを注文。
かつ丼は。さやえんどう、しいたけなども入っていて絶品です。
大雄山最乗寺境内の多宝塔への登り口の近くに、大きな石碑が2つ並んでいる場所があります。
石碑の裏側に、二十八丁目星宿燈があります。一丁目から数え歩いて最後の星宿燈です。
東京市浅草新吉原中米(なかごめ)楼と刻まれています。
二十八丁目星宿燈を建てた中米楼は、吉原の道了信仰の指導的立場にありました。*1
中米楼の関係者が出版した本として『吉原夜話』(青蛙房,1964)があります。初代市川猿之助(1855-1922、)の妻である吉原妓楼(中米楼)の女主人・喜熨斗古登子が、幕末から明治にかけての吉原の様子について口述したものです。*2*3
森の中に、苔に覆われた星宿燈が建つ姿は、幻想的です。
参廿一丁目の水常楼伊藤常吉は三業組合取締役等の公職に着いてはいなかったよう…
P.164
俳優の関係者が出版した本として『吉原夜話』(1964・青蛙房)が…
母は自分の名を琴ともまた古登も書いていましたが、晩年、私がよくもらう手紙に…
仁王門から「天狗のこみち」を歩くこと数十分。道了尊バス停の手前で道路に合流します。
参二十一丁目の星宿燈。「参」は星座の名前です。
水常楼伊藤常吉が建てた星宿燈。伊藤常吉は、吉原を仕切った大物でした。吉原各所の石造物に名を残しています。*1※1
星宿燈は古く、苔の緑に覆われています。
参廿一丁目の水常楼伊藤常吉は三業組合取締役等の公職に着いてはいなかったよう…
仁王門を過ぎ、さらに参道を進むと、やがて「てんぐのこみち」と名付けられた遊歩道に入ります。杉林の中を曲がりくねる坂道を登っていくと、100mおきぐらいに古びた石の道標が建っています。
石の道標の表面には一丁目から二十八丁目までが記され、人々に道程を知らせています。これらの道標はお寺が発行した古い案内書には「星宿燈」と紹介されています。*1
十一番目の道標。
寄進者の「新吉原江戸町二丁目 元鴨井楼 鴨志田かね」の名が刻まれています。
十一番目であることを示す「十一丁目」と刻まれたその上にもう一文字「虚」という漢字が冠されています。
これは、日本や中国で用いていた古い星座(星宿)名です。*1
上部に四角い口を開け、背中にも丸い穴があるので、かつては桟をはめ、灯をともして、道のありかを知らせる石灯籠だったとわかります。*1
仁王門前左側にある道了大薩埵碑。道了大薩埵(どうりょうだいさった)は、大雄山最乗寺の守護神。
台石に、「新吉原講」と大きく刻まれています。
吉原道了尊参拝の講の人たちが道標を建立したことがわかります。*1
道標の後ろ側に、由緒を示す石碑が建っています。
石碑の銘文を要約すると、遊廓吉原が開かれた元和年間に吉原講が結成され、以来、大雄山に詣でていて、天明2年に国府津に道標を建て、明治13年に再建したが、その道標が明治35年の海嘯(かいしょう)で崩壊したため、36年に松田に再建したということです。吉原講がかなり古くからも有力な講であったことが解ります。明治40年の星宿燈建立※1も、この吉原講が行ったと考えられます。*1
吉原講は、吉原遊廓が開かれた元和年間に結成され、以来、大雄山に詣でていました。天明2年に国府津に道標を建て、明治13年に再建、さらに明治36年に松田に再建されました。明治40年の星宿燈建立も、この吉原講が行ったと考えられています。*1
P.30
参道四丁目の仁王門の前には高さ2mを超える大きな石の道標が参道をはさ…
大雄山駅から最乗寺へ向かう道を1kmほど行くと、道了尊仁王門があります。(道了尊は最乗寺の別名です。)
階段脇に案内板があります。
仁王門があるこの場所までは、道路を歩きますが、仁王門から先は「天狗の小径」と呼ばれる杉林の中の参道が分岐していて、歩いて登ることもできます。参道には、一丁目から二十八丁目までを数える道標(二十八宿石燈籠)が建っています。
二十八宿石燈籠は、中国式の星座名を冠した石燈籠型の道しるべです。一丁目から二十八丁目の道程を知らせるとともに、宵祭りの参道を照らし参拝者を安全に導く燈籠として設けられたものです。燈籠は、元治元年(1864年)小田原誠信社中、及び明治40年(1907)東京浅草新吉原講中によって建てられました。
仁王門から最乗寺へは、およそ2kmの道のりです。
今回は、大雄山(だいゆうざん、神奈川県南足柄市)の町並みを散歩します。
伊豆箱根鉄道大雄山線の終着駅の大雄山駅。電車はここで折り返して小田原へ戻っていきます。
大雄山線には、長年(1962年-1996年)にわたり「赤電」の名で親しまれた「150系電車」がありましたが、創立100周年を迎えた2016年に、復刻版の運行が開始されました。*1
車両前面の「小田原←→大雄山」の行先系統板。 いい味出してます。
東京都台東区橋場2丁目にある「平賀源内の墓」の石碑。
実際の墓所は、ここから1本南側の通り沿いにあります。
平賀源内といえば、「エレキテル(摩擦起電機)」を復元制作したことで有名ですが、文筆においても実績を残しており、後の式亭三馬や十返舎一九にも影響を及ぼした戯作の開祖として評価されています。*1
案内板より:
平賀源内は享保13年(1728)、讃岐国志度浦(現香川県志度町)に生まれる。高松藩士白石良房の三男で名は国倫(くにとも)。源内は通称である。寛永2年(1749)に家督を継ぎ、祖先の姓である平賀姓を用いた。本草学、医学、儒学、絵学を学び、事業面では成功しなかったが、物産開発に尽力した。 物産会の主催、鉱山開発、陶器製造、毛織物製造などを行ない、エレキテル(摩擦起電機)を復元制作、火かん布(かかんぷ)(石綿耐火布)を発明した。一方で風来山人(ふうらいさんじん)・福内鬼外(ふくちきがい)などの号名を持ち、「風流志道軒伝(ふうりゅうしどうけんでん)」などの滑稽本や浄瑠璃「神霊矢口渡(しんれいやぐちのわたし)などの作品を残している。
源内の文筆における代表作である「風流志道軒伝」は、主人公が巨人国、小人国、女護島、などを遍歴するもので、「ガリヴァー旅行記」を思わせる風刺とファンタジーの快作と評されています。*1
吉原神社。吉原遊廓ゆかりの神社です。
境内にある石燈籠。
かつての吉原の有力者が寄進したものです。
水常は、大正期からある妓楼で、昭和33年の廃止時まで続きました。
鳥居に名が刻まれている伊藤常吉は、水常楼の楼主です。
今回は吉原(東京都台東区)の町並みを散歩します。
金美館通り沿いの交差点の角。
天ぷらの「いせや」が営業中です。
暖簾には、〇に「天」の字。「土手のいせや」と同じです。
天丼とビールを注文。
人車軌道(人が車両を手で押す軌道)の展示。
茂原と長南の間の人車軌道が開通したのは明治42年10月。茂原駅前を起点にして 長南の台向(現在の愛宕バス停)までの 約9kmの単線軌道が県道沿いに敷設されました。
人が車両を手で押していた頃の写真が残されています。
車両の内部。
茂原公園内にある茂原市郷土資料館へは、茂原駅から徒歩(約1.5km)か、藻原寺バス停で下車し、向かいます。
展示室に入ると、天然ガスの説明コーナーがあります。
右手前にある昭和の茶の間の展示。
エポック社のサッカーゲーム(初期のモデル)の展示。
初期のモデルでは、ボールのコントロールが難しいものでしたが、最新版では、改良が加えられています。*1
スコアボードなど、リアル感を演出しています。
茂原の榎町通り商店街。
交差点の角に、大正時代から続く定食屋の大和屋食堂があります。*1
映画のロケにも使われたこともあるノスタルジックな雰囲気の店内。*1
メンチカツ定食とビールを注文。
大和屋食堂。
大正時代から続く定食屋。ノスタルジックな雰囲気が伝わってく…
茂原では、明治時代、自家用の天然ガス井戸が数多く掘られ、「利用組合」という組織による天然ガス事業が営まれていました。昌平町稲荷神社の境内に、「茂原昌平町天然瓦斯組合」の痕跡が残されています。*1
境内に設置されたガス溜めの基礎(赤レンガ造り)の跡。40m³ほどの円形のタンクでした。*1
上から見ると、円形であることが解ります。
そばの石碑に、当時の「茂原昌平町天然瓦斯組合」の経緯、記録、組合員名が刻まれています。*1
JR線と並行する荒瀬橋から南側の遠望。
近くにガスタンク(現在塗装中)がある場所から、阿久川にガス管橋が架かっています。
太いパイプが3本。「天然ガスの町」茂原を象徴する風景です。
正式には「瓦斯輸送管専用橋」と呼ぶようです。昭和50年に作られました。
茂原駅から一宮川に架かる「日進橋」を渡ると、通称「日立通り」と呼ばれる広いまっすぐな通りが続きます。
「日立正門」バス停。かつての日立製作所茂原工場の遺構とも解釈できるバス停です。
バス停の隣に、日立安房神社があります。
昭和29年10月13日、館山市の安房神社からの分霊により、日立安房神社が建立されました。*1
日立製作所茂原工場や関連会社の名が刻まれています。
今回は、茂原(千葉県茂原市)の町並みを散歩します。
駅前の通り沿いにある「浮世風呂」。式亭三馬の滑稽本「浮世風呂」からの連想でしょうか。
10室近くありそうな建物です。
現在は、改装中のようです。
入口を入ってすぐのところに、2階へ上る赤色の階段があります。
木更津市吾妻1丁目にある極楽寺(平等院)。
ここに、幕末に幕府軍の一人として、官軍と戦い戦士した浅野作造の墓があります。
戦死した浅野作造の首級は木更津へ運ばれ、吾妻神社境内の路傍にさらされると、村人がその哀れさを忍び、路のほとりに小さな石をたて、お線香をあげて弔ったのが、いつの間にか「浅野様」と呼ばれ、民間信仰の対象になりました。*1
「浅野作造 源頼房」と刻まれています。
裏には「慶応四年辰年六月四日」「大正五年三月十八日改葬?」とあります。
大正時代になって、この地に墓が建てられたことが解ります。
木更津町鳥瞰図*2を見ると、吾妻神社の隣に、「浅野様」に記載があり、信仰を集めていた当時の様子が解ります。
木更津遊廓の遊女たちは、開店前のひととき、吾妻の浅野様へ参詣しました。*3
木更津市街東部の木更津2丁目。旧地名で、「元新地」と呼ばれていた地域の近くです。
周囲がコンクリートで固められたこの場所は、稲荷森古墳(前方後円墳)の前方部がわずかに残った部分です。明治14年に貸座敷を新設する時に鈴、鏡の破片、金銅装の刀、土器等が出土しました。*1
稲荷森古墳の上に高台稲荷神社が建っています。
古墳の頂上部分に建つ鳥居。
太田山公園の山頂にある橘神社。
橘神社は、日本武尊(やまとたけるのみこと)の東国征伐のとき亡くなった妃の弟橘媛(おとたちばなひめ)を慕って建てられた橘神社と言われています。
案内板に「恋の森」の由来が書かれています。
尊は、この山頂から海を見下ろし、媛を偲んでしばしこの地を去りかねたと伝えられています(写真は「きみさらずタワー」からの遠望)。
「きみさらず伝説」は房総各地に残されており、木更津には、弟橘媛を祭神とする吾妻神社※1があります。
富士見2丁目の南側。
ここに、江戸初期の海の痕跡である護岸が残っています。*1
大きな商家だったと思われるお宅。
しっかりとした石垣が残っています。
隣の駐車場にも石垣が続いています。
富士見通り近くの飲食街※1 から、東へ抜ける細道。
木更津会館(木更津芸寮組合、旧二業組合*1)のある通りに出ます。
「木更津会館」の建物の脇には、さらに、風情のある路地が続いています。
歩いてきた路地を振り返って見たところ。
【参考文献】
*1 石川空山,石崎白水:大木更津(木更津日報社,1939)付録「大木更津全図」
あ〇くらのうち、1枚欠落していますが、下の看板から「朝倉」と読み取れます。
特徴的な形状の軒下部分。
奥行のある建物です。
木更津駅に近い「みまち通り」商店街を少し行ったところにあるお鮨屋さん。
かつての商店街の繁栄ぶりが想像できる店構えです。
狭い店内ですが、落ち着ける空間です。
チラシ寿司とビールを注文。
今回は、木更津(千葉県木更津市)の町並みを散歩します。
木更津駅西口より徒歩10分。矢那川ほとりにある証城寺。
狸塚は、昭和4年、童謡「證誠寺の狸ばやし」の流行を記念し、建立されました。(案内板より)
證誠寺の狸塚:
この辺りが昼でも暗い程茂っていた昔のこと、寺の和尚さんが夜中に目を覚ますと庭の方が大変賑やかです。そっと節穴からのぞいて見ますと外は月夜で昼間のようです。折から秋のこととて萩の花盛り、ところが驚いたことには大小の狸数十匹が輪になり、
證誠寺山のペンぺコペン
俺らの友達やドンドコドン
と腹を打ちながら踊っています。和尚さんもついおもしろくなり一緒になって踊りました。 こうして毎晩踊りましたが 或夜狸達が全く姿を消してしまったので不思議に思って居りますとかわいそうにもお腹をたたき破って薮の中で死んでいました。和尚さんはこの友達をあわれに思ってねんごろに葬ってやったのがこの狸塚です。
この伝説が野口雨情先生によって狸ばやしの童謡が生まれ、さらに中山晋平先生の作曲により今や天下に広まりました。
童謡碑。
野口雨情・中山晋平先生の直筆が発見されたのを機に、昭和31年、建立されました。(案内板より)
1946年に放送が開始されたNHKのラジオ番組「英語講座」のテーマソングとして用いられ、最近では、2021年度後期のNHK朝ドラ「カムカムエヴリバディ」の劇中歌として登場しました。
英語歌詞:
Come come everybody.
How do you do, and how are you?
Won’t you have some candy?
One and two and three, four, five.
Let’s all sing a happy song.
Sing trala la la la.
「市民ホールやたべ」前に「みなのね」と題する像が設置されています。
茨城県出身の一色邦彦さんの作品です。
男女の裸像です。
後ろから。
四つ角。
今ではほとんど見かけなくなった牛乳店。
モダンな意匠の2階部分。
明治ビタ牛乳。左側には、「日の出」に「乳」のマーク。
筑波学園病院から南へ進むと、常磐自動車道を渡る橋に出会います。
「飛行場橋」と命名されています。
飛行場橋は1980年に建造。常磐自動車道の開通は1981年です。飛行場を偲んで命名されたのだと思います。
橋を渡った先はかつての飛行場の敷地です。現在は、「農林さくら通り」となっています。
飛行場橋の遠望。
谷田部の市街から約2Kmのところにある筑波学園病院。
筑波学園病院は、旧日本海軍航空隊谷田部飛行場の跡地に建てられており、筑波学園病院の前身である谷田部協同病院はその兵舎を病棟として設立、平成11年頃まで利用されていました。*1
北西側の駐車場の脇に記念碑が建っています。
高さ約メートルの記念碑の上部には、零戦のモニュメントが配置されています。*2
碑文
谷田部海軍航空隊は、昭和七年霞ヶ浦海軍航空隊(予科練)の補助飛行場としてこの地に開設され、練習機による飛行士養成を目的としていたが、昭和十四年独立し、零戦や紫電を主力として首都防空の実戦部隊となった。その後昭和十九年戦闘機操縦訓練隊となり沖縄方面の特攻作戦に従事した。戦後、跡地の一部建物(兵舎)を筑波学園病院の病棟として利用し、平成十一年に解体し現在に至っている。ここに恒久の世界平和を願いこの碑を建立するものである。
平成二十五年三月吉日
財団法人筑波麓仁会
石造りでありながら、細部まで表現されています。
終戦の年の1945年には神風特攻隊「昭和隊」も編成され、沖縄方面の作戦で多くの若者が命を落としました。*2
記念碑は、「昭和隊」出撃時に隊員を見送ったとされる桜の木の下に設置されています。*2
谷田部海軍航空隊記念碑除幕式が2013年5月19日(日)筑波学園病院敷地内で行われ…
旧日本海軍の飛行搭乗員を養成する練習航空隊が置かれ、特攻要員の訓練も行われ…
飲食ビル※1 の敷地の脇の公衆トイレ。
白地に大きくな文字でWC(water closet=水洗トイレ)と書かれています。
水洗トイレ(WC)は、昭和30(1955)年に発足した日本住宅公団が広く普及させたものの一つです。*1
昭和30~40年代は、公衆トイレにWCと表記されているのをよく見かけた記憶がありますが、最近は、「Toilet」、「Restroom」やさまざまなピクトグラム(絵文字)で表記されることが一般的なようです。
隣はブロック塀で仕切られています。
今回は、谷田部(茨城県つくば市)の町並みを散歩します。
谷田部の旧道沿いの郵便局近くの曲がり角に、飲食ビルがあります。
派手な装飾の飲食店。
居酒屋、クラブ、マッサージ店などが連なります。
飲食ビル口の看板。
日本橋富沢町の浜町川の水路跡※1 はさらに、北側へ続いています。
しかし、さきほどの商店街のような風景は全く無く、ビル裏側の殺風景な通路です。
水路跡の中央がやや窪んだ通路が延々と続きます。
通路は、「都有地」となっており、東京都下水道局が管理しています。
浜町川跡の地下に、公共下水道の「馬喰町幹線」がつくられているのは、「江戸の下水道が現代に引き継がれている。」といえます。※1
かつての浜町川は、千代田区岩本町まで続き、神田川に合流していました。
P.29
浜町川跡の地下に、公共下水道の「馬喰町幹線」がつくられているのは、…
江戸時代、水路として活用されていた浜町川は、戦後、埋め立てられ、跡地のほとんどは、オフィスビルが連なるビルの裏側の路地となっていますが、日本橋富沢町の部分だけは、商店街の雰囲気が残っています。
「梅の家」の屋号が残るお宅。
昭和の雰囲気が残る通りです。
北側から見たところ。飲食店も営業中です。
今回は、人形町(東京都中央区)の町並みを散歩します。
「日本橋中洲(にほんばしなかす)」という地名で呼ばれているこの付近は、もともとは、文字通り、隅田川の中州でした。
1695年(万治2年)、吉原の遊女高尾太夫がこの付近の船上で吊り斬りにされ、遺体が北新堀河岸(日本橋箱崎町)に漂着し、高尾稲荷に祀られたという逸話があります。※1
中洲は、江戸時代から明治にかけて、歓楽街として賑わいました。
マンション脇に鎮座する真砂座跡の碑。
漱石「猫」上演。真砂座跡、と刻まれています。
夏目漱石の「猫」は、小山内薫によって脚色された演劇で、明治39年に真砂座で上演されました。
碑文:
夏目漱石の「我輩ハ猫デアル」は、小山内薫によって脚色された。伊井蓉峰らが出演し、日本橋中洲の眞砂座跡で明治三十九(一九〇六)年十一月三日から三十日にかけて上演された。
平成十五年十月吉日
早稲田大学 第十四代総長 奥島孝康 識
日本橋室町1丁目。
ランチ営業中の老舗てんぷら店。
「てんぷら天松」は、1936年(昭和11年)に渋谷にて創業しました。
てんどんとビールを注文。
日本橋室町の通り。
ビルの谷間に佇む理容室。昭和の情緒が残っています。
1階が理容。2階が美容です。
懐かしい感じのする店構えです。
日本橋の美術店のある交差点。
ここに、美術店などの有志が建てた「十軒店(じっけんだな)跡」の碑があります。
「十軒店」は、江戸時代の仮設専門店街(人形市)のことで、当初、同業者が十軒あったことから、こう呼ばれるようになりました。*1
隣の「コレド室町テラス」には、中央区教育委員会が建てた別の案内板。
三月の上巳(桃)の節句には、内裏雛・禿人形・飾道具等を、五月の端午の節句には、冑人形、鯉のぼり等を商う人形市が立ち、十二月の歳暮の破魔矢・羽子板等を商う市とあわせて、大変なにぎわいを見せていました。
「十軒店」の人形市が、葛飾北斎の「画本東都遊」に描かれていることが紹介されています。
今回は、日本橋(東京都中央区)の町並みを散歩します。
日本橋のCOREDO室町北側に、「浮世小路(うきよしょうじ)」と名づけられた通りがあります(写真下)。近くには、「浮世小路千疋屋ビル」というのもあり、江戸切絵図にも記載のある「浮世小路」の名称は、最近、人気のようです。
現在の浮世小路。写真左奥に見える鳥居は、日本橋福徳神社(芽吹稲荷)。
福徳神社の敷地に、「浮世小路と料亭百川(ももかわ)」の案内板があります。
案内板より:
福徳神社南側の通りは江戸時代「浮世小路」と呼ばれていました。浮世小路の東端北側には 落語噺の舞台としても知られる料亭百川があったとされています。百川は江戸屈指の料理茶屋として繁盛し、幕末にペリー艦隊が来航した時には、乗組員全員にすべて自前で本膳を提供したほどの力がある料亭でした。
掩体壕には、有蓋(ゆうがい)のタイプと無蓋(むがい)のタイプがありますが、柏飛行場にあったのは、無蓋のタイプです。
こんぶくろ池のところに、1基残っています。
掩体壕の案内板。無蓋タイプは、周囲が土手で囲まれているイメージです。
観察路にしたがって進みます。
掩体壕跡。周囲が土手で囲まれていることが解ります。
柏の県道47号線沿いにある「ジャンボ蛇口」。まるで空を飛んでいるようです。
蛇口から水が出ていますが、後ろ側には何もありません。
蛇口は、近くにある水道などの設備会社の敷地に建つモニュメントです。蛇口から出る水の部分が支柱となっています。
支柱の根元部分は、きれいな花壇になっています。
現在の柏の葉公園一帯は、戦争中、旧日本陸軍の柏飛行場があった場所でした。
現在も旧陸軍東部第105部隊の営門が当時のまま残されています。*1
案内板には、飛行場の滑走路と誘導路の見取り図が示されています。*1
運動公園のあるあたりに、「飛行場跡地」の案内板があります。
つくばエクスプレス開通に伴う区画整理の中で、掩体壕や秋水の燃料庫などの新たな発見があったことが記されています。
豊四季台団地は、かつての柏競馬場跡地にできた団地です。
団地の中にある商店街のお肉屋さん。
揚げたてのコロッケが頂けます。
懐かしいオリエンタルカレー。通常は名古屋でしか買えません(一部の通販やカルディで購入できるそうですが)この店で買うことができます。
昭和45(1970)年頃、南利明※1 が名古屋弁のアクセントで、「ハヤシもあるでよう」とオリエンタル・スナックカレーのCFに登場するや、たちまち流行語になりました。*1
南利明が名古屋弁のアクセントで、「ハヤシもあるでよう」とオリエンタル・スナ…
柏の豊四季台団地。
かつて、ここには、地方競馬としては最大・最新の「柏競馬場」がありました。*1
競馬場は1段高い場所にあったため、その段差にかつての名残を見ることができます。写真は、団地の北東部分。
南西部分。こちらにもはっきりとした段差が認められます。
P.139
千葉県畜産組合連合会が大正末期、千葉市外の椿森で草競馬を行ってい…
日本光学工業(現在のニコン)は、昭和18(1943年)年2月、陸軍航空本部発注の…
昭和23年7月13日に競馬法が公布され、県では日本光学工業から競馬場を賃借して …
経済不況が深刻化するなか、第一回春季柏競馬が昭和3年5月6日から3日間、県畜産…
JR柏駅東口の柏銀座通り。
柏神社前は柏市の中心地で、このあたりは、老舗や飲み屋が多いところです。*1
1F,2Fに飲食店が入るビル。
「柏銀座商店会」の看板。
賑やかな通りは、奥まで続いています。
木更津市街の東のはずれ。国道16号線と国道409号線が交差するあたり。
この付近は貝塚の遺跡で、貝塚の発掘報告書に、「発掘場所(永井作豆造279番地)は、俗称「六軒町」と呼ばれる遊廓の屋敷跡」と記されています。*1*2
昭和34年頃までは、発掘場所の西側に、旅館や料理店が散在しており*3、歓楽街の名残があったようです。
南側の通り。
本遺跡は木更津駅の北東方1500mの地点に位置し、現在の行政区分に依れば木更津…
木更津の名店「富士見亭」。焼きそば専門店です。
矢那川の河口近くの交差点に1軒だけ建っています。
メニューは、「焼きそば」「焼きそば大盛」「缶ビール」の3品目のみ。
「焼きそば大盛」と「缶ビール」を注文。
木更津駅前から西へ延びる通り(富士見通り)に面して、飲食店のビルが建ち並んでいます。
クラブやバーが入るビル。
反対側から見たところ。
古びた広告看板。「こぶたの館」と書かれています。年数が経過しているためか、看板が著しく日焼けしています。
「お好み通り」は、ビルの裏側へ抜けられます。
富士見通りから、交差点を南へ入ったところにある越路ビル。
ビルの1階左寄りは、横丁になっていて「お好み通り」と名付けられています。
「お好み通り」は、ビルの裏側へ抜けられます。
江川海岸へ向かうの道路の南側(写真の左側)は、陸上自衛隊木更津駐屯地(旧日本海軍木更津海軍航飛行場)です。
フェンス越しに掩体壕(えんたいごう。戦時中の戦闘機用の壕)が見えます。
「木更津市郷土博物館 金のすず」の展示物によると、飛行場の北西部に単発機(発動機が1基)用の掩体壕が、飛行場の北側に中型機用の掩体壕が、それぞれ数基づつありました。
掩体壕を出て、この道路を移動し、滑走路から飛び立っていく姿が想像できそうです。
附近には、他にも遺構らしきものが見えます。
今回は、木更津の町並みを散歩します。
「日本のウユニ塩湖」と呼ばれ、人気のスポットとなっている江川海岸ですが、海岸の入口脇にある船堀は、昭和の雰囲気を醸し出している場所です。
船堀の中に出島のように突き出した場所にある綿津見神社。
高度成長期、東京湾岸の漁業協同組合は、莫大な補償金と引き換えに、次々と漁業権を放棄してきましたが、江川漁業協同組合は、東京湾岸で唯一残る自然干潟の潮干狩りをはじめ、現在も漁業が存続しています。
綿津見神社の敷地に、「江川船堀改修記念」の碑が建っています。
碑文:
遠き昔より海の幸を生業としきた私達は昭和十一年、旧海軍飛行場の建設に伴いこの地に移り、漁業の基地とした。以来四十有余年変遷著しい歴史の歩みの中に整備改修は、ままならず今日に至った。この船堀りの充実が多年に亘る組合員総ての願望であった。防衛施設庁、千葉県、木更津市の援助により、八千五百余万円の巨費を投入し、完成した。
昭和三十六年 江川漁業協同組合
綿津見神社から見た江川海岸方向。水門の向こうが潮干狩り場です。
街道沿いにあった梅屋旅館※1 からすぐの場所にホテルニュー梅屋が営業中です。
明治に梅屋旅館※1 として創業し、ホテルニュー梅屋を昭和55年にオープンしてから36年、今もつくば市谷田部で続く老舗のホテルです。*1
HOTELUMEYAの屋上看板。
東側の運動場からの眺め。1階は、レストラン「ミルキーウエイ」。
谷田川の橋から少し行ったところには、梅屋旅館(現在の梅屋ホテルの前身)がありました。旅館、料亭で芸者も置いていて繁盛していました。*1
梅屋旅館の建物は、しばらくの間、旧街道沿いに残っていました。ガラス戸に「梅屋」の文字が描かれていました。*1
現在も残る「梅屋旅館」の看板。
谷田川方面(西側)の遠望。
四つ角のバス停のところにある老舗和洋菓子店の玉川堂。
玉川堂は、かつては、「玉川館」という映画館を経営していました。*1
「玉川館」は、現在の和菓子屋玉川堂の裏手にあり、谷田部の海軍の飛行場の航空隊の人たちが沢山来ていたそうです。*2
大福、柏餅など購入。餡子は非常にあっさりとしていて、いくつでも食べれます。
この付近は、旧町名で「内町」と呼ばれていました。
昭和 4 年~6 年の繁盛記によると、内町には、二業の料理旅館が存在していました。*3
P.74
その裏側には「大正十三年七月二十二日建立という建立年月日と,建立に…
橋から少し行ったところが旧梅屋で、現在の梅屋ホテルの前身があった。旅館、料…
「谷田部商人繁昌記」(以下,原文)
谷田部四つ角の交差点近くに、獣霊碑(牛馬の供養塔)が建っています。*1
碑の裏面には、寄付者として、谷田部町料理店として 11名,谷田部町芸妓営業として1名の名前があり、当時の賑わいが想定されます。*1
「大正13年建立」と刻まれています。
周囲は綺麗に整備されています。
P.74
その裏側には「大正十三年七月二十二日建立という建立年月日と,建立に…
今回は、谷田部(茨城県つくば市)の町並みを散歩します。
つくばエクスプレス線みどりの駅からバスで約5分で谷田部四つ角の交差点へ到着です。
交差点の近く。
中華料理店のような店名のですが、理容室です。
地元の方の話によると、創業120年だそうです。
野田銀座※1 の通り沿いのそば店「住吉」。
昭和の商工名鑑*1 や商工地図*2 にも載っている老舗です。
店内。
かつ丼の定食とビールを注文。
P.199
芸妓置屋 中…
かつて野田銀座*1 と呼ばれていた通り。
昭和38年の「野田商工名鑑」によると、この付近には芸妓置屋がありました。*2
国際パブ。
明治~大正の頃は、近くに醸造工場(粕谷第五醸造場)があり、この通りには人車鉄道が通っていました。*3
P.199
芸妓置屋 中…
千葉県野田町全図(大正四年)をもとに作図。
香取神社の北側の十字路。
旅館の入口は交差点の角に面しています。
「馬酔木」。スナック店などでよく見かける屋号です。
北側の道はゆるやかに弧を描いています。
野田市上花輪の香取神社。かつては、この付近に多くの醸造所が密集していました。
境内の奥にある富士塚。3mぐらいはありそうな大きなものです。
麓に安置されている粟嶋大神。
頂上からは、反対側の道路の交差点が望めます。
醤油発祥の地の碑のあるあたりから東側へ延びる通り。
商店だったと思われるお宅。
木造家屋に木製の牛乳箱はよく似合います。
横開きタイプです。
今回は、野田(千葉県野田市)の町並みを散歩します。
野田市街の中心部。野田郵便局の流山街道を挟んだ反対側の路地を少し入ったところに、野田醤油発祥の地の碑があります。
この地は、室町時代に飯田家が初めて野田で醤油を醸造した場所です(碑の案内文より)。
野田市の文化財に指定されています。
鳥居に、茂木房五郎(野田醤油(現キッコーマン)社長)の名が刻まれています。
吾妻神社社殿の左側(道路側)。
富士塚があります。
高さ2m近くありそうな富士塚です。
富士浅間大神。
日本神話に登場する木花咲耶姫(このはなさくやひめ)、邇邇芸命(ににぎのみこと)、磐長姫命(いわながたらしめのみこと)が祀られています。
陸上自衛隊駐屯地の近く、木更津市吾妻2丁目にある吾妻神社。
吾妻神社の祭神は、弟橘媛(おとたちばなひめ)。弟橘媛は、日本書紀に登場する伝説上の英雄「日本武尊(やまとたけるのみこと)」の妃です(吾妻神社 案内板より)。
入口に建つ石柱の側面には、「君去らず 袖しが浦に立つ波の その面影を 見るぞ悲しき」の歌が刻まれています。
社伝には、日本武尊が東征の際。相模から上総へ海を渡ろうとした時、荒れた海に身を投じた弟橘媛の袖がこの近くの海岸に漂着したので、これを納めて吾妻神社を建てたとあります(吾妻神社 案内板より)。
「君不去」=きみさらず=木更津と呼ぶようになったといわれています(きみさらず伝説)。*1
この「きみさらず伝説」にあやかったのでしょうか、吾妻神社には、遊廓寄進の石塔があります。
右側の石塔には、「第一京都樓」と刻まれています(写真右下)。
左側には「第二京都樓」。
木更津遊廓の遊女たちは、開店前のひととき、吾妻へ参詣したそうです。*2
本町四つ角から少し入ったところにある紅雲堂書店。昔の佇まいのままの建物です。
軒下の屋号。
2010年頃から、まち歩きを目的とした鳥瞰図パネルが設置されるようになったためでしょうか。こちらの書店では、木更津町鳥瞰図の販売も行われています。
紅雲堂の位置が記されています。
本町四つ角(中央2丁目)の角に残る看板建築。
「本町通り」には呉服屋などのお店や銀行などが軒を連ね、木更津の商業の中心地として栄えていました。*1
現在の建物は昭和7年に建てられた看板建築です。*1
モダンな外観は今も本町四つ角の目印として異彩を放っています。*1
現在は、時計修理・ラジオメーター・アンティークの専門店「金田屋リヒトミューレ」となっています。(前回(2007年)、訪れたときは、「レディースサークル ひまわり」でした。)
昭和4年の絵図で金田屋洋品店のところが本町四つ角と呼ばれ、ここから南に「九…
木更津市中央1丁目の田面通り(たもどおり)。
かつては田んぼであった通りにたくさんの商店が並ぶようになったことから、「田面通り」と呼ばれるようになりました。*1
交差点の角に3階建ての防火帯建築が建っています。
1階には、「森田屋本店」。
江戸時代からの老舗生そば店です。*1
入口前には、かすれて、ほとんど読み取れない看板が立っています。
生そばの他に、洋食、中華、も。
天ぷらそばとビールを注文。
木更津の街中から久留里へ通ずる街道は近郷からの人々で賑わい、かつては…
今回は、木更津の町並みを散歩します。
木更津市中央1丁目にある選擇寺。
境内の奥まったところに、こうもり安の墓があります。
「こうもり安」は、木更津の油屋「紀の国屋」の次男として生まれ、男ぶりがよく、天性の美声に加え金回りもよく、花柳界の寵児と言われるほどの人物でした(案内板より)。
「こうもり安」は、歌舞伎「与話情浮名横櫛(よわなさけうきなのよこぐし)」の主人公の与三郎※1 の相棒(脇役)としておなじみでした(案内板より)。
昭和6年に、チャップリンの「街の灯」の主人公を「与話情浮名横櫛」のこうもり安に当てはめた「蝙蝠の安さん」が初演されました。
気象大学校近くの狭小建物。
長屋風の共同建物です。写真右奥は、東武野田線の踏切。
居酒屋、スナックなどが連なっています。
建物の裏側。わずかに曲線を描いています。
JR南柏駅から徒歩10分。松が丘団地へ向かう途中の寺院の敷地に重要文化財となっている街路灯(レトロ電柱)が保存されています。
電柱は柵で囲まれ、隣には、教育委員会の説明板があります。
プレートの文字も読め、保存状態は極めて良好です。
蓋を開けた中には、スイッチが納められています。
商店街の脇道を入ったところにあるカラオケスナック。
その奥に、質店の暖簾が見えます。
質店の看板。
質店脇の路地。
柏駅西口から北側へ柏市立柏第一小学校向かう方向に、柏一小通り商店街が連なっています。
商店や居酒屋などが建ち並びます。
スナック「トミー」。「コーヒー」とも書かれていますが、飲食業柏連合会のホームページでは、業種は居酒屋となっています。
柏第一小学校側から。
今回は、柏(千葉県柏市)の町並みを散歩します。
柏駅西口のデッキを北側へ進み。階段を降りようとすると眼下に大きな桜の木が目に入ります。
その桜の木の下に、もつやきのお店。
外にも座席があります。
大きな桜の木の下は喫煙所になっていて、憩いの場になっています。
千葉県最北の関宿町の南。野田市中戸に、古民家カフェの「水塚」が高台に建っています。
店名の「水塚」は、かつての関宿で多く見られた、洪水の際に避難するための土盛りの上に設けられた建物の「水塚」*1 に由来するものと思われます。
反対側から見ると、土が盛られていることがよく解ります。
この日は、残念ながら休みの日でした。
江戸川の土手からの遠望。
関宿町の鈴木貫太郎記念館の近くに、今ではほとんど見かけなくなったヒノキ風呂製造・販売店があります。
「風呂」の文字。
風呂や桶などが販売されています。
工場が併設されています。
関宿城博物館には、房総の河川 の利根川・江戸川の近世~近現代や産業・暮らしに関する展示が行われています。
当時の絵図。
関宿は、河岸の町となり、積荷を扱う商人が集まり、蔵が建ち並び、市場が開かれました。茶屋、旅籠、遊廓。賭場なども当然のごとく生まれました。*1
蒸気船「通運丸」が明治10年に就航し、関宿と両国(墨田区)を結びました。
関宿は、周囲を河川に囲まれ、水害が多かったため、人々は、土を盛って高くしたところに、水塚(みずか)と呼ばれる小屋(洪水時の避難施設)を作って、水がひくまでここに寝泊まりしました。
今回は、関宿(せきやど、千葉県野田市)の町並みを散歩します。
東武動物公園駅から、バスで30分、そして徒歩で15分。畑の中に怪しげな天守閣がそびえたっています。
関宿城(せきやどじょう)は、野田市関宿三軒家にあった日本の城ですが、現在は、再現され現在は、千葉県立関宿城博物館になっています。
博物館の入口。
天守閣の最上階からの眺め。
WordPressの本を書きました。Amazonでお買い求め頂けます。
本書は、本来ブログ用ソフトであったWordPressを、Webサイト用のソフト(CMS)として活用するためのノウハウをまとめたものです。
ブログは、記事を時系列で羅列したものです。ブログ記事が蓄積されると、たとえば、文献の情報のページを作り、これとブログ記事を連携させたいというような要望ができています。このような場合、サブクエリー(WP_Query)やサブループの記述などにPHPのコーディングが必要となるのですが、カスタマイズを進めていいくにつれ、PHPコードの量も増えメンテナンスの工数も増えます。
本書は、PHPのコード量が多くてもメンテナンスが継続できるよう、類似のコードをクラスにまとめて再利用する方法について基本知識をまとめたものです。
タイトル:オブジェクト指向WordPress
著者名:風きよし
発行:古今東西舎
発売日:2020年9月1日
価格:¥1,700+税
地図表示でマーカーを表示するとき、マーカーをクリックするとポップアップ表示するだけでなく、外部のテキストからポップアップを開くことができれば、より便利です(下図)。
この機能を実現するためには、Leaflet側のマーカーのポップアップとWordPressで表示するテキスト表示を動的に連動させることが必要です。
コード量も増えるので、再利用しやすいようにClassに分けて記述することが理想的です。
【お知らせ】
上記の事例3に示すオブジェクト指向(MVCモデル)の使い方については、本書で詳しく解説しています。
本事例は、「Leaflet 外部からポップアップを開く」をもとに作成しました。
<body>
<div id="map_1" style="height: 400px;"></div>
</body>
<p>
<a href="1234map_1"onmouseover="popupOn1(0);">【東京都】</a>
<a href="3456map_1" onmouseover="popupOn1(1);">【千葉県】</a>
<a href="589map_1" onmouseover="popupOn1(2);">【埼玉県】</a>
</p>
<script>
//背景地図
var osm = new L.tileLayer
('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: "Map data © <a href='https://www.openstreetmap.org/copyright' target='_blank'>OpenStreetMap</a> contributors"
});
var map_1 = L.map('map_1', {
layers: [osm],
center: [35.6896, 139.6918],
zoom: 9,
zoomControl: true
});
//マーカー情報
var markers=[];
markers[0]=L.marker([35.6896, 139.6918]).addTo(map_1).bindPopup("東京都");
markers[1]=L.marker([35.6050, 140.1234]).addTo(map_1).bindPopup("千葉県");
markers[2]=L.marker([35.8572, 139.6490]).addTo(map_1).bindPopup("埼玉県");
//ポップアップを開く関数
function popupOn1(id){
markers[id].openPopup();
}
</script>
本事例は、WordPressのサブクエリーによってテキストデータを動的に表示し、そのループ処理の中でLeafletのマーカー表示を行い、WordPressのテキスト側からLeafletのポップアップ操作を行う事例です。
冒頭のstatic public $const = array() ;でクラス定数$constを定義します。これは、ループ処理の中でマーカーの情報を一時的に格納するための配列定数です。
$the_query = new WP_Query($args) ;にてサブクエリーを実行します。
テキストを表示するWhileループの中で、クラス定数$constに、 緯度($lat),経度( $lon), コンテンツのタイトル($title)などを格納します。以上がPHPの処理です。
次に、HTMLによる背景地図の設定を行います。
<div id="map_2" style="height: 400px;"></div>
最後にLeaflet.jsによる描画処理を行います。
static public $const = array() ;//クラス定数を定義
public function __construct()
{
//サブクエリー(テキストを抽出)
$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'region',
'field' => 'term_id',
'terms' => '9790',//中央区
),
array(
'taxonomy' => 'genre',
'field' => 'term_id',
'terms' => '10274',//商店街
)
)
);
$the_query = new WP_Query($args) ;
//サブループ
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
$count++;
//表示(View)部分
//クラス定数へ緯度経度情報を書き込み
$array = code40307::$const ;//クラス定数を読み込み
$num = $count-1 ;
$id = get_the_ID() ;
$title = get_post($id)->post_title ;
$lat = get_post_meta($id, 'latitude', true);//緯度
$lon = get_post_meta($id, 'longitude', true);//経度
$array[] = [$id, $lat, $lon, $num, $title];//多次元配列に要素を追加
code40307::$const = $array ;//クラス定数へ書き込み
//HTML記述
?><a class="<?php
echo $par2->id ;
echo ' ' ;
echo 'tag' ;
?>"href="<?php
echo get_permalink();
?>" onmouseover="<?php
echo 'popupOn2('.$num.');' ;
?>"><?php
the_title() ;
echo "<br>\n" ;
?></a><?php
}//endwhile
}//endif
//事物表示
//クラス定数の呼び出し
$map_marker_json = json_encode(code40307::$const);
//地図エリアの設定
?>
<body>
<div id="map_2" style="height: 400px;"></div>
</body>
<script>
//背景地図
var osm = new L.tileLayer
('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: "Map data © <a href='https://www.openstreetmap.org/copyright' target='_blank'>OpenStreetMap</a> contributors"
});
var map_2 = L.map('map_2', {
layers: [osm],
center: [35.664897,139.776624],
zoom: 15,
zoomControl: true
});
//マーカー表示
var array = JSON.parse('<?php echo $map_marker_json; ?>');
var addmarker2=[];
var i = 0
//ループ
array.forEach(function(id){
addmarker2[i]=L.marker([id[1],id[2]]).addTo(map_2).bindPopup(id[4]);
i++;
});//endeach
//ポップアップを開く関数
function popupOn2(id){
addmarker2[id].openPopup();
}
</script>
//外部からLeafletを操作する(オブジエクト指向MVCモデル)
class code40309
{
static public $const = array() ;//クラス定数を定義
public function __construct()
{
$args = array(
'model' => '37694',
'view' => '40309',
'pattern_m' => 'Sour',
'entity_from' => 'Term',
'entity_to' => 'Post',
'post_type' => 'post',
'orand' => 'and',
'tax' => array('region','genre'),//地域、ジャンル
'field_value' => array('9809','10274'), //台東区、商店街
);
$user = new Controller37694($args) ;
$user = new View40309Map() ;
$user = new View40309Mapmarker() ;
}
}
//表示を行うクラス(View)
class View40309
{
public function __construct($par)
{
$array2 = code40309::$const ;//クラス定数を読み込み
$num = $par->num ;
$num = $num-1 ;
$id = get_the_ID() ;
$title = get_post($id)->post_title ;
$lat = get_post_meta($id, 'latitude', true);//緯度
$lon = get_post_meta($id, 'longitude', true);//経度
$array2[] = [$id, $lat, $lon, $num, $title];//多次元配列に要素を追加
code40309::$const = $array2 ;//クラス定数へ書き込み
?><a class="<?php
echo $par2->id ;
echo ' ' ;
echo 'tag' ;
?>"href="<?php
echo get_permalink();
?>" onmouseover="<?php
echo 'popupOn('.$num.');' ;
?>"><?php
the_title() ;
echo "<br>\n" ;
?></a><?php
}//endfunction
}//endclass
//背景地図を表示するクラス
class View40309Map
{
public function __construct()
{
?>
<body>
<div id="map_3" style="height: 400px;"></div>
</body>
<script>
var osm = new L.tileLayer
('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: "Map data © <a href='https://www.openstreetmap.org/copyright' target='_blank'>OpenStreetMap</a> contributors"
});
var map_3 = L.map('map_3', {
//layers: [osm,old1],
layers: [osm],
center: [35.712364,139.787258],
zoom: 14,
zoomControl: true
});
</script>
<?php
}//endfunction
}//endclass
//マーカーを表示するクラス
class View40309Mapmarker
{
public function __construct()
{
$map_marker_json2 = json_encode(code40309::$const);
?>
<script>
var array = JSON.parse('<?php echo $map_marker_json2; ?>');
var addmarker=[];
var i = 0
array.forEach(function(id){
addmarker[i]=L.marker([id[1],id[2]]).addTo(map_3).bindPopup(id[4]);
i++;
});//endeach
//ポップアップを開く関数
function popupOn(id){
addmarker[id].openPopup();
}
</script>
<?php
}//endfunction
}//endclass
WordPressの投稿タイプやタクソノミーを理解しようとするとき、ER図を書いてみると、視覚的に理解しやすくなります。
データの集合をエンティティと呼びます。下図は、3つのエンティティ(ブログ投稿、市区町村、ジャンル)をデータの実例付きで図示したものです。
ER図では、主キーと外部キーを記述します。主キーは、図056の最左端のデータ項目で、エンティティのレコードを識別します。表の右端にある「市区町村ID」「ジャンルID」は、それ自身が別のエンティティの主キーとなり得るデータ項目で、外部キーと呼ばれます。 一つのエンティティに主キーは必ず一つですが、外部キーは複数持つことができます。図では、ブログ投稿は二つの外部キーを持つことによって、「ジャンル」と「市区町村」2つのエンティティを関連を持っています。
また、「市区町村」の事例は、外部キーが自身の主キーと結びつく「親子関係」のエンティティの事例です。
ブログ投稿と市区町村の関係は、1:N
・1つのブログ投稿に対し1つの市区町村が関連。
・その市区町村は別のブログ投稿とも関連。
ブログ投稿とジャンルの関係は、N:N
・ジャンルは、1つのブログ投稿に対し複数設定可能。
(例)
西仲通り商店街は、「商店街」と「路地」に関連
市区町村は親子ループ(1:N)を持つ
・1つの親は1つまたは複数の子を持つ。
・子に対し、親は1つ。
・同一エンティティの中で主キーと外部キーが結びつく(親子関係)。
上記のER図の主キーと外部キーのみを表記すると下図のようになります。主キーと外部キーに注目すると、下記4パターンに集約されます。
ⓐDestinationパターン
ⓑSourceパターン(MetaQuery、TaxQuery)
ⓒAncestorsパターン(現世代→先祖)
ⓓDescendantsパターン(現世代→子孫)
Webサイトを開発する前に全体のデザイン(設計)をすることが必要です。まず、エンティティを抽出し、それらの関連づけを行うための主キー、外部キーはを決めることが重要です。
下図は当サイトの場合のER図の事例です。WordPressは投稿タイプとタクソノミーの2種類がありますので、どちらにするかも最初にするかを決めておく必要があります。
エンティティ同士の関連には、
❶投稿タイプとタクソノミーの関連づけ
❷投稿タイプのカスタムフィールドによる関連づけ
❸parentフィールドによる親子関係の関連づけ
の3種類があります。
WordPressはイベント駆動型モデルであると言われています。これは、URLを指定するだけで自動的にデータを取得(メインクエリー)し、自動的にテンプレートファイルを選択して画面表示(メインループ)するものです。
しかし、カスタム投稿タイプやカスタムタクソノミーを使ったWebアプリケーション開発に重きを置く場合は、サブクエリーを多用する場面が増えてきます。
WordPressには、サブクエリーを効率よく開発するためのモデルがありません。
今回は、サブクエリーを効率よく開発するために、MVCモデルを適用することについて解説します。
MVCモデルは、Modelクラス、Viewクラスにコードを集約し、オブジェックト指向の継承やオーバーライドを使って、類似のコードを抽象化することによって、コーディングの作業を軽減することができます。
次にオブジェクト指向でないコード(従来の書き方)とMVCモデルを使ったオブジェクト指向のコードを比較してみることにします。
//サブクエリー
$args = array(
//条件の記述
);
//WP_Query
$the_query = new WP_Query($args) ;
//サブループ
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
//表示の記述
the_title() ;
echo "<br>\n" ;
}
}//endif
class Controller
{
public function __construct($var){
$par =(object)$var;
$user = new Model($args);
または
$user = new ViewPost() ;
$user->format();
}
}
class Model
{
public function __construct($var)
{
//サブクエリー
$args = array(
//条件の記述
);
//WP_Query
$the_query = new WP_Query($args) ;
//サブループ
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
//Viewクラスの呼び出し
$user = new ViewPost() ;
$user->format();
}
}//endif
}//endfunction
}//endclass
class View
{
public function __format()
}//endfunction
}//endclass
class ViewPost extends View
{
public function __format()
//表示
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
//呼び出す側
$args = arry(
//条件の記述
);
$user = new Controller($args);
サブクエリー(WP_Query)とサブループは、書き方のパータンがたくさんあり、すべてのパターンを覚えるのは大変なことです。そのため、書くたびにコードディングミスが起こり、完成するまでに時間がかかります。当然のことながら、これをメンテする作業も大変です。
これに対し、オブジェクト指向で書かれたコードは、呼び出す側は、フィルタリング条件を記述してクラスを呼び出すだけで、サブクエリー~サブループ~表示までの処理が完了します。
もちろん、呼び出される側のクラスとして、Controllerクラス、Modelクラス、Viewクラスがあり、これらのコードを合わせると、オブジェクト指向を使った場合の方がコードの量は格段に増えます。しかし、これらのクラスは、再利用することを前提に作成していますので、次回からは、呼び出す側の記述のみで済みます。
また、クラスには、スーパークラス(親クラス)の機能を継承して、差分の部分のみをサブクラス(子クラス)に記述することができ、メンテの効率が向上します。
WordPressの基本の理解で最も重要なことは、構造の理解です。理解するためには、図で示すことが最も近道です。
WordPressは、クエリーとループから成り立っています。
クエリー:データの検索
ループ:データの表示
WordPressの入門時に一番初めに理解すべきことは、メインクエリーとメインループですが、メインクエリーは「WordPressコア」と呼ばれる基本部分に包含されていて、通常はカスタマイズできないということです。(メインクエリーをカスタマイズするには、「フック」という特別なカスタマイズ方法を用います。)
WordPressのカスタマイズを理解の第一歩は、テーマの中にあるメインループを見つけ出し、ループの中の記述を自分の好みに合うようにカスタマイズし、実感をつかむことです。
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
//
// この部分が記述(カスタマイズ)部分
//
} // end while
} // end if
?>
上記のコードのif ( have_posts() )から} // end ifまでがメインループの記述で、その内側の部分がカスタマイズ部分で、ここに、たとえば、the_title();と書けば、投稿のタイトルが表示され、the_content();と書けば、投稿の本文が表示されるわけです。
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
//記述(カスタマイズ)部分
the_title();
the_content();
//
} // end while
} // end if
?>
もう一つ重要なポイントは、このメインループが実行される手前の段階で、「WordPressコア」の中のメインクエリーが、既に実行を完了しており、その結果がオブジェクトと呼ばれるデータの塊に保持されているということです。この塊から具体的なデータを抜き出す命令が、the_title();やthe_content();です。このとき、データは複数件あるので、これをメインループで回して表示しています。
WordPressのカスタマイズで頻繁に出てくるサブループについては、上記の概念図に併記すると理解が深まります。
メインクエリーが「WordPressコア」の中にあって、自動的に実行されるものであるのに対し、サブクエリーは、自分でコードを書く(カスタマイズする)ことが必要ですが、行っている処理は、メインクエリーと同じです。(両方ともWP_Queryが実行されている同じ処理。)
サブクエリーの結果は、オブジェクトに出力され、それを表示するのがサブループです。メインループとサブループの書き方は、ほぼ同じです。
上記の概念図では、左から右へ「クエリー」「ループ」「表示」と情報が転送され、全体としては、上から下へ「メイン」「サブ」と処理が進んでいくことを図示しています。
これまで、WP_Queryのカスタマイズ事例※1※2※3を示してきましたが、今回は、このうちのDestinationパターン※1とSourceパターン※2の事例を統合した万能型サブクエリーについて解説します。
$args = array(
'model' => '37694',
'view' => '37694',
'pattern_m' => 'Sour',
'entity_from' => 'Term',
'entity_to' => 'Post',
'post_type' => 'post',
'tax' => array('region','genre'),//タクソノミー名:地域、ジャンル
'field_value' => array('9790','10274'), //タクソノミーの値:中央区、商店街
);
$user = new Controller37694($args) ;
class Controller37694
{
public function __construct($args)
{
//////配列をオブジェクトに変換
$par =(object)$args;
//////Modelメソッドの呼び出し
$model_name = 'Model'.$par->model ;
$model_obj = new $model_name($par) ;
}//endfunction
}//endclass
class Model37694
{
public function __construct($par)
{
//参照パターン毎に$argsの値を設定するため、分岐させるための$args_nameの値を設定。
$args_name = $par->pattern_m.$par->entity_from.$par->entity_to ;
if ($args_name == 'SourTermPost'){
$query_name = 'tax_query' ;
}elseif($args_name == 'SourPostPost'){
$query_name = 'meta_query' ;
}
$args = array(
'order' => $par->order,
'orderby' => $par->orderby,
'include' => $par->foreign_key,//タクソノミー用DPT
'hide_empty' => false,//Listのとき要DPT
'meta_key' => $par->meta_key,//DPP
'post_type' => $par->post_type,//DPP
'post__in' => $par->foreign_key,//DPP
'posts_per_page' => -1,//全行表示DPP
$query_name => array(
'relation' => $par->orand ,
array(
'taxonomy' => $par->tax[0],
'field' => 'term_id',//STP
'terms' => $par->field_value[0],//STP
'key' => $par->field[0],//SPP
'value' => $par->field_value[0],//SPP
),
array(
'taxonomy' => $par->tax[1],
'field' => 'term_id',//STP
'terms' => $par->field_value[1],//STP
'key' => $par->field[1],//SPP
'value' => $par->field_value[1],//SPP
)
)
);
if ($args_name == 'DestPostTerm'){
$the_query = get_terms($par->tax, $args);
}else{
$the_query = new WP_Query($args) ;
}
////////////////////表示ループ
//Viewクラスのクラス名を設定
$view_name = 'View' . $par->view;
$num = 0 ;
//表示するエンティティがpostの場合
if ($par->entity_to == 'Post'){
//while文でのループ処理
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
$num = $loopcounter++ +1;
if ($num == '1' && !empty($par->title)){
echo '<h2>' . $par->title . '</h2>' ;//タイトルを表示
}
//カウントアップした番号$numをオブジェクト$parに設定
$par->num = $num ;
//Viewオブジェクトをインスタンス化
$view_obj = new $view_name($par);
}// end while
wp_reset_postdata();
}//end if
//表示するエンティティがtermの場合
}elseif ($par->entity_to == 'Term'){
echo '<h2>' . $par->title . '</h2>' ;
//foreach文でのループ処理
foreach ($the_query as $term){
$num = $loopcounter++ +1;
//カウントアップした番号$numと表示するオブジェクト$termをオブジェクト$parに設定
$par->term = $term ;
//Viewオブジェクトをインスタンス化
$view_obj = new $view_name($par);
}//endforeach
}else{
}//endif
}//endfunction
}//endclass
class View37694
{
public function __construct($par)
{
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
築地(西仲通り商店街)明治時代の埋め立て工事により出来上がった町。前回※1 「投稿のカスタムフィールドに関連付けられた投稿の表示」で、ブログ記事に文献の情報を関連付ける事例を紹介しました。(実際の画面サンプルはこちらです。)
この例では、「第八章 月島の商業」が関連付けられていますが、この上の階層である「第三編 明治以降の月島」と最上位階層である書籍名の「月島発展史」を併せて表示しています。
カスタム投稿タイプ「参考文献」は、親子関係を持った木(ツリー)構造になっていて、最初に関連付けされた「第八章 月島の商業」をキーに、祖先(父母→祖父母)の階層を表示しています。
リスト37639は、カスタム投稿タイプの祖先を表示するコードです。
カスタム投稿タイプ「参考文献」の全体を一覧表示する場合は、階層のトップのIDを指定し、それをキーに子孫の階層を上から順番に検索して表示します。(実際の画面サンプルはこちらです。)
リスト37639は、投稿の子孫を表示するコードです。WordPressのテンプレートタグ「get posts」を使って子孫を検索しています。
木(ツリー)構造を持つタクソノミーの全体を表示する事例を紹介します。(実際の画面サンプルはこちらです。)
たとえば「中央区」を選択した場合、祖先に東京都、子孫に月島3丁目があります。これらの表示をクリックするとどちらにでも移動できるようにすると便利です。また、自分が現在どの階層にいるかも解りやすくなります。
リスト36732は、タクソノミーの祖先と子孫の両方を表示する事例です。現世代の「中央区」を指定すると、まずその先祖を表示し、次に子孫を表示します。
$par2->gen_id = '18661';
$par2->post_type = 'reference' ;
$user = new Model37639() ;
$user->generation($par2) ;
class Model37639 extends WP_Query
{
public function generation($par2)
{
$ance = array() ;
$ance = get_ancestors($par2->gen_id, $par2->post_type) ;
//$cnt = count($ance);
$ance = array_reverse($ance) ;
$k = 0 ;
While ( !empty($ance[$k])) {
$par2->id = $ance[$k] ;
$par2->k = $k ;
$View_obj = new View37639a($par2) ;
$k = $k +1 ;
}//endwhile
}//endfunction
}//endclass
class View37639a
{
public function __construct($par2)
{
$postslist = get_post($par2->id) ;
setup_postdata($postslist);
echo $postslist->post_title."<br>\n" ;
}//endfunction
}//endclass
$par2->gen_id = '18444';
$par2->post_type = 'reference' ;
echo "<br>\n".'ID: '.$par2->gen_id."<br>\n" ;
$user = new Model37642() ;
$user->generation($par2) ;
class Model37642 extends WP_Query
{
public function __construct()
{
//コンストラクタは、なぜ今回使わないのか。
}//endfunction
public function generation($par2)
{
//現世代を表示
echo '現世代'."<br>\n" ;
$par2->id = $par2->gen_id ;
$par2->k = 0 ;
$View_obj = new View37642a($par2) ;
//子孫を表示
echo '子孫'."<br>\n" ;
$this->children($par2) ;
}
public function children($par2)
{
//抽出処理
$k = $par2->k ;
$args = array(
'post_type' => $par2->post_type ,
'post_parent' => $par2->id ,
'orderby' => 'menu_order',
'order' => 'ASC',
);
$the_query = get_posts($args) ;
if(empty($the_query)){
return ;
}
//ループ処理
$k = $k +1 ;
foreach($the_query as $query){
$par2->id = $query->ID ;
$par2->k = $k ;
$View_obj = new View37642a($par2) ;
$this->children($par2) ;//再帰処理。
}
}//endfunction
}//endclass
class View37642a
{
public function __construct($par2)
{
$postslist = get_post($par2->id) ;
setup_postdata($postslist);
echo 'k='.$par2->k.' '.$par2->id ;
echo $postslist->post_title."<br>\n" ;
}//endfunction
}//endclass
$par2->gen_id = '9790';
$par2->entity_name = 'region' ;
echo "<br>\n".'ID: '.$par2->gen_id."<br>\n" ;
$user = new Model36732() ;
$user->generation($par2) ;
class Model36732//計算するクラス。
{
public function __construct()
{
//コンストラクタは、なぜ今回使わないのか。
}//endfunction
public function generation($par2)
{
$ance = array() ;
$ance = get_ancestors($par2->gen_id, $par2->entity_name) ;
//$cnt = count($ance);
$ance = array_reverse($ance) ;
//////先祖が存在しない場合、$anceは中身は空なので、次の処理へ進む。
//先祖を表示。
echo '先祖'."<br>\n" ;
$k = 0 ;
While ( !empty($ance[$k])) {
$par2->id = $ance[$k] ;
$par2->k = $k ;
$View_obj = new View36732a($par2) ;
$k = $k +1 ;
}//endwhile
//現世代を表示
echo '現世代'."<br>\n" ;
$par2->id = $par2->gen_id ;
$par2->k = $k ;
$View_obj = new View36732a($par2) ;
//子孫を表示
echo '子孫'."<br>\n" ;
$this->children($par2) ;
}
public function children($par2)
{
//抽出処理
$k = $par2->k ;
$args = array(
'parent' => $par2->id ,
);
$the_query = get_terms($par2->entity_name, $args) ;
if(empty($the_query)){
return ;
}
//ループ処理
$k = $k +1 ;
foreach($the_query as $term){
$par2->id = $term->term_id ;
$par2->term = $term ;//$par2に追加。
$par2->k = $k ;//$par2に追加。
$View_obj = new View36732b($par2) ;
$this->children($par2) ;//再帰処理。
}
}//endfunction
}//endclass
class View36732a//表示するクラス。
{
public function __construct($par2)
{
$term = get_term($par2->id , $par2->entity_name ) ;
echo 'k='.$par2->k.' '.$par2->id ;
echo $term->name."<br>\n" ;
}//endfunction
}//endclass
class View36732b//表示するクラス。
{
public function __construct($par2)
{
echo 'k='.$par2->k.' '.$par2->id ;
echo $par2->term->name."<br>\n" ;
}//endfunction
}//endclass
リスト37167は、meta_queryの事例。
リスト37179は、tax_queryの事例です。
class code37167
{
public function __construct()
{
$args = array(
'model' => '37167',
'view' => '37167',
'post_type' => 'post',
'field' => array('ref'),//参考文献
'field_value' => array('18661'),//第八章 月島の商業
);
$user = new Controller37167($args) ;
}//endfunction
}//endclass
class Controller37167
{
public function __construct($args)
{
//////配列をオブジェクトに変換
$par =(object)$args;
//////Modelメソッドの呼び出し
$model_name = 'Model'.$par->model ;
$model_obj = new $model_name($par) ;
}//endfunction
}//endclass
class Model37167
{
public function __construct($par)
{
$args = array(
'post_type' => $par->post_type,
'meta_query' => array(
'relation' => 'OR',
array(
'key' => $par->field[0],
'value' => $par->field_value[0],
)
)
);
$the_query = new WP_Query($args) ;
//ループ~表示処理(Viewクラス)の呼び出し。
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
$view_name = 'View'.$par->view ;
$view_obj = new $view_name($par) ;
}
}//endif
}//endfunction
}//endclass
class View37167
{
public function __construct($par)
{
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
築地(和風スナック)沢の鶴の看板。月島三丁目。class code37179
{
public function __construct()
{
$args = array(
'model' => '37179',
'view' => '37179',
'tax' => array('region','genre'),//タクソノミー名:地域、ジャンル
'field_value' => array('9790','10274'), //タクソノミーの値:中央区、商店街
'post_type' => 'post',//投稿タイプ:ブログ記事
);
$user = new Controller37179($args) ;
}//endfunction
}//endclass
class Controller37179
{
public function __construct($args)
{
//////配列をオブジェクトに変換
$par =(object)$args;
//////Modelクラスの呼び出し
$model_name = 'Model'.$par->model ;
$model_obj = new $model_name($par) ;
}//endfunction
}//endclass
class Model37179//投稿を表示
{
public function __construct($par)
{
$args = array(
'post_type' => $par->post_type,
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => $par->tax[0],
'field' => 'term_id',
'terms' => $par->field_value[0],
),
array(
'taxonomy' => $par->tax[1],
'field' => 'term_id',
'terms' => $par->field_value[1],
)
)
);
$the_query = new WP_Query($args) ;
//ループ~表示処理(Viewクラス)の呼び出し。
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
$view_name = 'View'.$par->view ;
$view_obj = new $view_name($par) ;
}
}//endif
}//endfunction
}//endclass
class View37179
{
public function __construct($par)
{
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
人形町(日本橋大伝馬町の路地)江戸の下水道が現代に引き継がれています。今回は、投稿データに関連付けられたタクソノミーや別の投稿を表示する方法について紹介します。
WP_Queryは、あるデータの集合(これをエンティティと呼びます)の外部キーから別のエンティティの主キーを検索しデータ群(オブジェクト)取得する仕組み(クラス)です。
WordPressの場合のエンティティは、「投稿タイプ」「カスタム投稿」「カテゴリー」「ターム」「カスタムタクソノミー」などのデータの集合です。これらのエンティティ同士は、主キーと外部キーで関連付けられます。
下図は、ブログ投稿の外部キーにカスタムタクソノミー「ジャンル」が関連づけられている場合を図示したものです。
リスト37209は、投稿のカスタムフィールドに関連付けられた投稿の表示の事例です。
ブログ記事のような投稿データに、別の投稿データを関連づけて表示したい場合があります。
リスト37211は、投稿に関連付けられたタクソノミーの表示の事例です。
ブログ記事のような投稿データには、タクソノミー(カテゴリー、タグ)を関連づけて記事の分類分けをしますが、このとき、ブログ記事のタイトルの上部や本文の末尾などにタクソノミーを表示したい場合があります。
class code37209
{
public function __construct()
{
$user = new Model37209() ;
}//endfunction
}//endclass
class Model37209 extends WP_Query
{
public function __construct()
{
$args = array(
'post_type' => 'post',
'post__in' => array('18348'),//IDを配列で指定。
);
$the_query = new WP_Query($args) ;
//ループ~表示処理(Viewクラス)の呼び出し。
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
$view_obj = new View37209($par) ;
}
}//endif
}//endfunction
}//endclass
class View37209
{
public function __construct($par)//$parはいらない。
{
the_title() ;
echo "<br>\n" ;
//次の処理の準備
//投稿に関連付けられているカスタムフィールドのIDを取得する。
$myposts = get_post_meta(get_the_ID(), 'ref', false) ;//'ref'を指定。
if (!empty($myposts)){
$par->foreign_key = $myposts ;
$user = new Model37209a($par) ;
}else{
return ;
}
}//endfunction
}//endclass
class Model37209a
{
public function __construct($par)
{
$args1 = array(
'post__in' => $par->foreign_key,//配列をそのまま記述
'post_type' => 'reference',//DPP
);
$the_query = new WP_Query($args1) ;//WP_Query
//ループ~表示処理(Viewクラス)の呼び出し。
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
$view_obj = new View37209a($par) ;
}
}//endif
}//endfunction
}//endclass
class View37209a
{
public function __construct($par)
{
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
築地(西仲通り商店街)明治時代の埋め立て工事により出来上がった町。class code37211
{
public function __construct()
{
$user = new Model37211() ;
}//endfunction
}//endclass
class Model37211
{
public function __construct()
{
$args = array(
'post_type' => 'post',
'post__in' => array('18348'),//IDを配列で指定。
);
$the_query = new WP_Query($args) ;
//ループ~表示処理(Viewクラス)の呼び出し。
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
$view_obj = new View37211($par) ;
}
}//endif
}//endfunction
}//endclass
class View37211
{
public function __construct($par)
{
the_title() ;
echo "<br>\n" ;
//次の処理の準備
//投稿に関連付けられているタクソノミーのIDを取得する。
$myterms = wp_get_object_terms(get_the_ID(), 'region');
if (!empty($myterms)){
$foreign_key = array() ;
foreach ($myterms as $post){
array_push( $foreign_key , $post->term_id);
}
}else{
return ;
}//endif
$par->foreign_key = $foreign_key ;
$user = new Model37211a($par) ;
}//endfunction
}//endclass
class Model37211a
{
public function __construct($par)
{
$args = array(
'include' => $par->foreign_key,
);
$the_query = get_terms('region', $args) ;
//ループ~表示処理(Viewクラス)の呼び出し。
foreach ($the_query as $term){
$par->term = $term ;
$view_obj = new View37211a($par) ;
}
}//endfunction
}//endclass
class View37211a
{
public function __construct($par)
{
echo $par->term->name."<br>\n" ;
}//endfunction
}//endclass
築地(西仲通り商店街)明治時代の埋め立て工事により出来上がった町。サブクラスにおいてWP_Queryを使うことのメリットは、拡張(継承)してカスタムクラスを作れることです。Rakhitha Nimesh Ratnayake(ラーキサ・ニーメシュ・ラーネヤク)は、その著書「WordPressによるWebアプリケーション開発」の中で、WP_Queryクラスの継承の用例を示しています。*1
リスト37188は、ラーネヤク氏が示した用例を本書のテーマに即してアレンジしたものです。
通常、WP_Queryを使うときは、次のように配列にすべてのフィルタリング条件を記述しなければなりませんが、リスト37188では、Modelクラスの中にこの記述を書いているので、呼び出す側は、1行のコードのみで済みます。
たしかに、同じフィルタリング条件を何度も繰り返し使う場合はこの方法が有効であり、クラスを継承すれば、少し異なる条件の場合も含めて抽象化できるかもしれません。
しかし、あらゆるパターンのサブクエリー(投稿の場合、タームの場合、親子の場合)と表示をすべて網羅的に抽象化するためには、もう一工夫必要です。
リスト36618は、リスト37188をアレンジし、この課題を解決するための方法です。
呼び出す側に、フィルタリング条件を羅列しますが、そこには値を直接記述します。これを受け取ったModelクラスは、その値をWP_Queryのフィルタリング条件にあてはめます。
この方法のメリットは、面倒なWP_Queryの記述から解放されるということです。
さらに、表示するViewクラスの名称なども呼び出す側の条件に加えることにより、サブクエリーから表示までを一貫して抽象化することができそうです。
$the_query = new Model37188();
//ループ
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
//Viewの記述
$view_obj = new View37188($par2) ;
}
wp_reset_postdata();
}//endif
class Model37188 extends WP_Query
{
public function __construct( $args = array() )
{
//クエリー
$args = wp_parse_args( $args, array(
'post_type' => 'glossary',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'gloss_type',
'value' => '9851',
),
array(
'key' => 'region',
'value' => '9790',
)
)
)
);
parent::__construct($args) ;
}
}
class View37188
{
public function __construct($par2)
{
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
$args = array(
'post_type' => 'glossary',
'key' => array('gloss_type','region'),
'value' => array('9851','9790')
);
$query = new Model36618($args);
class Model36618 extends WP_Query
{
public function __construct($var)
{
//配列をオブジエクトに変換。
$par =(object)$var;
//クエリー
$args = array(
'post_type' => $par->post_type,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => $par->key[0],
'value' => $par->value[0],
),
array(
'key' => $par->key[1],
'value' => $par->value[1],
)
)
);
$the_query = new WP_Query($args) ;
//ループ
if($the_query->have_posts()){
While($the_query->have_posts()){
$the_query->the_post();
//Viewの記述
$view_obj = new View36618($par2) ;
}
wp_reset_postdata();
}//endif
}
}
class View36618
{
public function __construct($par2)
{
the_title() ;
echo "<br>\n" ;
}//endfunction
}//endclass
「Leaflet」は、Webサイトに地図を載せる場合に利用するツールです。
「Leaflet」はフリーソフトでありながら、細かなオプションが用意されているのが特徴です。
リスト1 は、背景となる地図(ベース地図)を表示するコードです。
WordPressにLeafletを埋め込む場合は、事前準備として、function.phpに、Leafletを読み込むコードを記述します。
まず、事前準備として、次のコードをfunction.phpに記述します。
function leaflet_enqueue_styles() {
wp_enqueue_style( 'leaflet-style', '//unpkg.com/leaflet@1.5.1/dist/leaflet.css', NULL, NULL );
}
add_action( 'wp_enqueue_scripts', 'leaflet_enqueue_styles' );
/* 先にスタイルシートを読み込んでからJavaScriptを読み込む */
function leaflet_enqueue_script() {
wp_enqueue_script( 'leaflet-js', '//unpkg.com/leaflet@1.5.1/dist/leaflet-src.js', NULL, NULL );
}
add_action('wp_enqueue_scripts', 'leaflet_enqueue_script');
次にテンプレートファイルに次のコードを記述します。
<body>
<div id="map_1" style="height: 400px;"></div>
</body>
<script>
//////背景地図
var osm = new L.tileLayer
('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: "Map data © <a href='https://www.openstreetmap.org/copyright' target='_blank'>OpenStreetMap</a> contributors"
});
var map_1 = L.map('map_1', {
layers: [osm],
center: [35.717007,139.752772],
zoom: 18,
zoomControl: true
});
</script>