
あ〇くらのうち、1枚欠落していますが、下の看板から「朝倉」と読み取れます。

特徴的な形状の軒下部分。

奥行のある建物です。

あ〇くらのうち、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>
古地図をWEB地図上に表示するためには、スキャナーやデジタルカメラなどを使って紙の地図をデジタル化し、それをWEB地図上に貼り付けるわけですが、このとき、
(1)古地図に緯度・経度の情報を付加する作業
(2)古地図を適切な形に整形して (ゆがめて) 現実の地図の上に置く作業
が必要です。この作業のことをジオリファレンスと言います。
「日本版MapWarper」は、このジオリファレンスを簡単に行うことができるツール(ジオリファレンサー)です。
オープンソース・ソフトウェアなので、誰でも無料で利用でき、公開した地図(されている地図)は、誰でも閲覧でき、ダウンロード利用できます。
今回は、鯖江市が公開している古地図データ*1 を日本版MapWarperにアップロードして、ジオリファレンスを行います。
日本版MapWarperに会員登録し、ログインし、メニューの「地図をアップロードする」を使って古地図をアップロードします。
次に、「整形」の機能を使って、古地図を変形・伸縮させて現実の地図の座標に合うよう整形(ジオリファレンス)します。画面の左側が古地図、右側が現実の地図です。大正時代の地図は現在の地図にぴったりと重なりませんので、ここで補正を行います。両方の地図の一致する場所をダブルクリックして基準点を登録します。今回は、11か所の基準点を登録しました。①から⑪までの基準点が図示されています。
最後に「切り抜き」の機能を使って古地図の余分な部分を取り除くと完成です。
「プレビュー」のタブに切り換えると、現実の地図の上に古地図が重ねられた状態が確認できます。*2
前回※1、get_template_part()に引数を渡す方法を紹介しましたが、この方法では、
(1)呼び出す側にset_query_varと呼び出される側にget_query_varをその都度書かなければならないこと。
(2)PHPファイル別々に作成するので、見通しが悪くなること。
ことが、課題です。
そこで、今回は、これに代わる方法として、classを呼び出す方法を紹介します。
$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
WordPressのカスタマイズの規模が大きくなると、8割~9割は同じようなPHPのコードを何度も書いていることがあります。このようなときは、別ファイルを作成してソースコードを分割し、コードを再利用することにします。
分割した別ファイルは、get_template_part()によって呼び出しますが、このとき、再利用の度合いを高めるために引数を渡したい場合があります。
WordPressCodexには、テンプレートに変数を渡す方法が解説されています。
今回は、一例として、引数taxと引数termを渡して、テンプレート側サブクエリーを実行する例を紹介します。
$args = array(
'tax' => 'region',
'term' => '9789',
);
set_query_var( 'val', $args) ;
get_template_part( 'template-parts/sample/content', 'sample' );
<?php
//引数を受け取り
$var = get_query_var('val');
$par =(object)$var;
//サブクエリー
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => $par->tax,
'field' => 'term_id',
'terms' => $par->term,
)
)
);
$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
築地(和風スナック)沢の鶴の看板。月島三丁目。◆新型コロナウイルスの感染拡大に伴い、当面の間、散歩ブログの更新を休止致します。
◆ブログトップのURLを下記の通り変更しました。
ご迷惑をおかけしますが、よろしくお願い致します。
(変更前)http://kokontouzai.jp/sanpo
(変更後)http://kokontouzai.jp/blog/sanpo
◆新たに、ITに関するブログの掲載を始めました。
(URL)http://kokontouzai.jp/blog/it
茂原駅前に建つ駅前ビル。1階は、飲食店街になっています。
昔ながらの洋食屋。
店内は、バーのような雰囲気。
ナポリタンとビールを注文。
房総横断道路から北へ入った通り。
銭湯の桜湯があります。
ペンキで書かれた「桜湯」の文字
傍らには、桜の木。屋号の由来の木でしょうか。
房総横断道路沿い。
交差点脇に1軒屋の建物。
サロン(風俗店)と軽食が併設された店舗です。
現在は休業している模様です。
今回は、茂原(千葉県茂原市)の町並みを散歩します。
茂原の榎町商店街と駅前通り商店街は1970年代か ら1980年代に最盛期を迎えました。*1
現在も当時からの商店が建ち並んでいます。
商店街は500mほど続きます。東側の通りにも看板建築が残っています。
住居部分と一体となったお菓子屋さん。
佐竹商店街の東側(小島一丁目)の清洲橋通り。
三軒長屋の商店。色は3色です。
2階部分。
後方に、3階建て部分が見えます。
佐竹商店街から西へ入った路地。
看板建築の建物が残っています。
銅板建築。
隣のトタン建築の物干し台。
佐竹商店街(台東3丁目)は、江戸時代に佐竹藩の屋敷があたことから名づけられた商店街で、南北300mに及ぶ長大な商店街です。
商店街にある「吉田屋」。
「モスリン店」※1 の看板が掲げられています。」
竹久夢二の作品。
入谷の交差点。遠くには東京スカイツリーが見えます(写真左奥)。
北上野側の交差点の角のビルの2階部分に、「モスリン店」と書かれています。
「モスリン(織物)」という呼び名は、毛斯綸紡織(株)(1896(明治29)年設立)の社名※1 や大阪の「モスリン大橋」という橋の名前※2 に使われました。明治時代の殖産興業政策を連想させる呼び名です。
歩道橋から見たモスリン店。
上野3丁目のビル街。
銭湯の燕湯は、国の登録有形文化財に指定されている貴重な銭湯です。
ビルの1階部分が宮型銭湯となっていますが、建物全体はビルになっている独特の建築です。
銭湯の裏側の通り。
上野アメ横の東側の通りにある玩具問屋「上野屋」。
創業は昭和25年(1950年)です。*1
店舗の前面には、マスク類が所狭しと陳列されています。宴会などで使用するおもちゃ類を販売しているようです。
看板には、「流行・教材・季節・景品・サービス・花火 各種玩具」「玩具問屋」と書かれています。
2階部分には懐かしいアニメなどのポスター類が貼られています。
ボビーオロゴン、美川憲一(コロッケ)。
東上野三丁目のビル街。通り沿いには、仏壇店が連なっています。(写真の左右の店舗はいずれも仏壇店です。)
通りを南へ入ったところにあるラブホテル。
モダンなデザインの入口。
反対側(南側)から。
今回は、上野(東京都台東区)の町並みを散歩します。
JR上野駅の東側(東上野三丁目)のビルの地下1階にある純喫茶「古城」。
入口の階段のステンドグラスには、白馬の騎士が描かれています。
店内は、荘厳な雰囲気です。
ココアを注文。
京成電鉄幕張駅前。線路沿いの通りに中華料理店があります。
「町中華」という言葉がぴったりくるような中華料理「松楽」。
テーブル席3つとカウンター席。
チャーハンとビールを注文。チャーハンには大きめのチャーシューがたくさん入っていて、風味と歯ごたえが充分です。
京成電鉄幕張駅近くの線路沿い。舗装されていない道の先。
美容室「ローズ」の看板
木造家屋の美容室です。
「パーマ」の大看板は、遠くからでも見えます。
幕張駅の北東側。徒歩5分のところにある銭湯の鈴の湯。
昔ながらの銭湯です。
銭湯には、破風屋根の軒下に細かな細工の懸魚(けぎょ)を見かけることがありますが、鈴の湯の場合は「鈴」のオブジェです。
「鈴の湯」と書かれた煙突。
今回は、幕張(千葉県千葉市花見川区)の町並みを散歩します。
JR幕張本郷駅の南側。京葉道路幕張インターの東側にラブホテル街に、宇宙船の形をしたラブホテルがあります。
正面入口。
入口のゲートには、ロケットを模したオブジェ。
宇宙船の丸窓。
新小岩駅南口の平和橋通りから西へ入る小路。小路の先に飲み屋のほ灯が見えます。
立ち飲み屋「わか」。今年で30周年(暖簾に書いてありました。)だそうです。
周囲は、小規模な飲み屋街になっています。
名物の刺身盛り合わせとホッピーを注文。
江戸川区松島の住宅街の中にある銭湯の「旭湯」。
都内ではめずらしい、昔ながらの銭湯です。
中庭には金魚が泳いでいます。
建物の南側。
今回は、新小岩(東京都葛飾区)の町並みを散歩します。
新小岩二丁目の住宅街。
児童公園の隣に大ゲートが出現します。
住宅街の中のラブホテル。
L字型の小路を抜けると反対側にもゲートがあります。
鶯谷駅南口の前から言問い通りへ向かう坂道の下。
老舗とんかつ店「とん平」があります。開業は戦後だそうです。
カウンター席だけのこじんまりとした店です。とんかつはロースカツとヒレカツのみ。
ロースカツとライス、ビールを注文。
下谷1丁目の住宅街。
交差点の角に、古いコンクリート製の建物があります。1階には店舗。同じビルに質屋の看板が残っています。
建物の側面。
側面の窓の配置から、3階建ての建物であることが解ります。
鶯谷駅前の「ダンスホール新世紀」。
隣のビルの屋上に残る「銀星 PLAYSPOT GINSEI」のレトロ大看板。パチンコ店か何かだったのでしょうか。現在、「銀星」の店舗はビル内には見当たりません。
1Fにある歌謡曲カフェ。
鶯谷駅からの遠望。
鶯谷のラブホテル街は、駅前の言問い通りの南側が中心ですが、言問い通りの北側にも大規模なホテル街が立地しています。
敷地内に祠のあるラブホテル(写真中央に祠の屋根が見えます。)
メインの通り。
西側には、高層階のホテルが建ち並んでいます。
今回は、鶯谷(東京都台東区)の町並みを散歩します。
鶯谷駅南口の陸橋を渡った線路沿いに、木造三階建ての建物が連なっています。
飲み屋街。
スナックの入口。
シスタービル。
浅草橋5丁目にある「すし栄」。
握り寿司とビールを注文。
かつての「すし栄」は銀座数店舗あったそうです。
ピンクの看板が目印です。地元の方の話によると、かつては「ピンク寿司」と呼ばれ親しまれていたそうです。
蔵前橋通りの南側。浅草橋5丁目に、銭湯の鶴の湯があります。塀や建物の壁面は鮮やかな水色に塗られています。
鶴が彫りこまれた懸魚は見事です。
料亭の建物のような意匠。
入口。
レトロな建物が残っているおかず横丁。
理容室(バーバー)。
レトロなパーマ屋さん。
交差点の角の赤い建物の美容室。
浅草橋の北側。鳥越1丁目のおかず横丁。
看板建築の商店の建物など、昔の商店街の雰囲気が残っています。
銅板が貼れた重厚な感じの看板建築。
裏側からの眺め。
かつての花街があった柳橋一丁目。
篠塚稲荷神社の隣に、老舗やきとり店があります。
釜めしと焼き鳥。
焼き鳥定食と日本酒を注文。
かつての柳橋の花街は、墨田川沿いにありました。
「昭和37年の柳橋マップ」*1 によると、この通りの東側(写真左側)に、「料亭深川亭」「料亭子安」「料亭卯の木」「料亭はやし」「料亭津久松」「料亭柳水」がありました。
佃煮屋の「小松屋」のマーク
反対側(南側)から。
墨田川からの遠望。現在はビルが建ち並んでいます。
今回は浅草橋(東京都台東区)の町並みを散歩します。
かつての花街だった柳橋の路地に老舗寿司店が営業中です。
建物は道を挟んで、本店は2棟あります。
創業は、文化5年。
風情のある路地。