{"id":12622,"date":"2026-02-24T15:38:31","date_gmt":"2026-02-24T15:38:31","guid":{"rendered":"https:\/\/withcode.tech\/media\/?p=12622"},"modified":"2026-07-06T14:37:30","modified_gmt":"2026-07-06T14:37:30","slug":"headless-cms-site-search-wordpress-astro","status":"publish","type":"post","link":"https:\/\/withcode.tech\/media\/headless-cms-site-search-wordpress-astro\/","title":{"rendered":"\u3010\u5b9f\u88c5\u30ac\u30a4\u30c9\u3011\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3067\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u3092\u5b9f\u88c5\uff01WordPress\u00d7Astro\u3067\u5b8c\u5168\u69cb\u7bc9\u306e\u624b\u9806\u3092\u8a73\u3057\u304f\u89e3\u8aac"},"content":{"rendered":"<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-14.48.08.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3067\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u3092\u4f5c\u308a\u305f\u3044\u3093\u3067\u3059\u304c\u3001\u3069\u3046\u3084\u3063\u3066\u5b9f\u88c5\u3059\u308c\u3070\u826f\u3044\u3067\u3057\u3087\u3046\u304b\uff1f<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.11.23.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u3088\u30fc\u304f\u805e\u304f\u3093\u3060\u305e\uff01WordPress\u3092\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3068\u3057\u3066\u4f7f\u3044\u3001Astro\u3068REST API\u3092\u7d44\u307f\u5408\u308f\u305b\u308c\u3070\u3001\u9ad8\u901f\u3067\u67d4\u8edf\u306a\u691c\u7d22\u6a5f\u80fd\u304c\u4f5c\u308c\u308b\u3093\u3058\u3083\u3002\u4eca\u65e5\u306f\u5b9f\u88c5\u65b9\u6cd5\u3092\u8a73\u3057\u304f\u89e3\u8aac\u3059\u308b\u305e\u3044\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<div class=\"wp-block-group swl-box\"><div class=\"wp-block-group__inner-container\">\n<h2 class=\"wp-block-heading\">\u3053\u306e\u8a18\u4e8b\u3067\u308f\u304b\u308b\u3053\u3068<\/h2>\n<ul class=\"wp-block-list\">\n<li>\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3068\u306f\u4f55\u304b\u3001\u5f93\u6765\u306eWordPress\u3068\u306e\u9055\u3044\u3068\u63a1\u7528\u3059\u308b\u30e1\u30ea\u30c3\u30c8<\/li>\n<li>WordPress REST API\u306e\u691c\u7d22\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u4f7f\u3044\u65b9\u3068API\u30e9\u30c3\u30d1\u30fc\u95a2\u6570\u306e\u5b9f\u88c5<\/li>\n<li>React Hook Form\uff0bZod\u3067\u578b\u5b89\u5168\u306a\u691c\u7d22\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u308b\u65b9\u6cd5<\/li>\n<li>Astro\u306e\u30cf\u30a4\u30d6\u30ea\u30c3\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\uff08SSR\uff09\u3067\u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u3092\u5b9f\u88c5\u3059\u308b\u624b\u9806<\/li>\n<li>\u30ab\u30c6\u30b4\u30ea\u30fc\u30d5\u30a3\u30eb\u30bf\u30fc\u30fb\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u30fb\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u3088\u308b\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3092\u4f7f\u3063\u305fWeb\u30b5\u30a4\u30c8\u5236\u4f5c\u304c\u5897\u3048\u3066\u3044\u308b\u4e2d\u3001\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u6a5f\u80fd\u306e\u5b9f\u88c5\u306f\u907f\u3051\u3066\u901a\u308c\u306a\u3044\u8ab2\u984c\u3067\u3059\u3002\u5f93\u6765\u306eWordPress\u30c6\u30fc\u30de\u3068\u7570\u306a\u308a\u3001\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u304c\u5206\u96e2\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u691c\u7d22\u6a5f\u80fd\u3082\u72ec\u81ea\u306b\u5b9f\u88c5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u8a18\u4e8b\u3067\u306f\u3001<strong><span class=\"swl-marker mark_yellow\">WordPress REST API\u3068Astro\u3092\u4f7f\u3063\u305f\u9ad8\u901f\u306a\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u3001\u57fa\u790e\u304b\u3089\u5fdc\u7528\u307e\u3067<\/span><\/strong>\u3001\u5b9f\u88c5\u4f8b\u3092\u4ea4\u3048\u3066\u5fb9\u5e95\u7684\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3068\u306f\uff1f\u5f93\u6765\u306eWordPress\u3068\u306e\u9055\u3044<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u30d8\u30c3\u30c9\u30ec\u30b9CMS\uff08Headless CMS\uff09\u3068\u306f\u3001<strong>\u30b3\u30f3\u30c6\u30f3\u30c4\u7ba1\u7406\u6a5f\u80fd\uff08\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\uff09\u3068\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u306e\u8868\u793a\u3092\u5b8c\u5168\u306b\u5206\u96e2\u3057\u305fCMS\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/strong>\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u7279\u5fb4<\/th><th>\u5f93\u6765\u306eCMS<\/th><th>\u30d8\u30c3\u30c9\u30ec\u30b9CMS<\/th><\/tr><\/thead><tbody><tr><td>\u69cb\u6210<\/td><td>\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3068\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u304c\u4e00\u4f53<\/td><td>\u5b8c\u5168\u306b\u5206\u96e2<\/td><\/tr><tr><td>\u8868\u793a\u65b9\u6cd5<\/td><td>CMS\u306e\u30c6\u30fc\u30de\u30b7\u30b9\u30c6\u30e0<\/td><td>\u4efb\u610f\u306e\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u6280\u8853<\/td><\/tr><tr><td>\u30c7\u30fc\u30bf\u53d6\u5f97<\/td><td>\u5185\u90e8\u51e6\u7406<\/td><td>REST API \/ GraphQL<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u30b5\u30fc\u30d0\u30fc\u51e6\u7406\u306b\u4f9d\u5b58<\/td><td>\u9759\u7684\u751f\u6210\u3067\u9ad8\u901f\u5316\u53ef\u80fd<\/td><\/tr><tr><td>\u67d4\u8edf\u6027<\/td><td>\u30c6\u30fc\u30de\u306e\u5236\u7d04\u3042\u308a<\/td><td>\u5b8c\u5168\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd<\/td><\/tr><tr><td>\u30de\u30eb\u30c1\u30c1\u30e3\u30cd\u30eb<\/td><td>Web\u5c02\u7528<\/td><td>Web \/ \u30a2\u30d7\u30ea \/ IoT\u7b49\u306b\u5bfe\u5fdc<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u30d8\u30c3\u30c9\u30ec\u30b9WordPress\u306e\u30e1\u30ea\u30c3\u30c8<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4f7f\u3044\u6163\u308c\u305fWordPress\u7ba1\u7406\u753b\u9762<\/strong>\uff1a\u30b3\u30f3\u30c6\u30f3\u30c4\u7ba1\u7406\u306fWordPress\u306e\u512a\u308c\u305fUI\u3092\u305d\u306e\u307e\u307e\u6d3b\u7528<\/li>\n<li><strong>\u8c4a\u5bcc\u306a\u30d7\u30e9\u30b0\u30a4\u30f3<\/strong>\uff1aSEO\u30fb\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30fb\u30e1\u30c7\u30a3\u30a2\u7ba1\u7406\u306a\u3069\u306e\u65e2\u5b58\u30d7\u30e9\u30b0\u30a4\u30f3\u304c\u5229\u7528\u53ef\u80fd<\/li>\n<li><strong>\u5f37\u529b\u306aREST API<\/strong>\uff1a\u6a19\u6e96\u3067REST API\u304c\u7528\u610f\u3055\u308c\u3066\u304a\u308a\u3001\u3059\u3050\u306b\u4f7f\u3048\u308b<\/li>\n<li><strong>\u9ad8\u901f\u306a\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9<\/strong>\uff1aAstro\u30fbNext.js\u30fbNuxt\u306a\u3069\u306e\u30e2\u30c0\u30f3\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u9ad8\u901f\u5316<\/li>\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5411\u4e0a<\/strong>\uff1a\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u304c\u5206\u96e2\u3055\u308c\u3001\u653b\u6483\u9762\u304c\u6e1b\u5c11<\/li>\n<li><strong>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3<\/strong>\uff1a\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3092CDN\u3067\u914d\u4fe1\u3057\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u306b\u9ad8\u901f\u914d\u4fe1<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Astro\u3068\u306f\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Astro\u306f\u3001<strong>\u9ad8\u901f\u306a\u9759\u7684\u30b5\u30a4\u30c8\u751f\u6210\u306b\u7279\u5316\u3057\u305f\u30e2\u30c0\u30f3\u306aWeb\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af<\/strong>\u3067\u3059\u3002\u30bc\u30edJavaScript\u304c\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u3001\u5fc5\u8981\u306a\u90e8\u5206\u3060\u3051\u306bJavaScript\u3092\u914d\u4fe1\u3059\u308b\u300c\u90e8\u5206\u7684\u30cf\u30a4\u30c9\u30ec\u30fc\u30b7\u30e7\u30f3\u300d\u304c\u7279\u5fb4\u3067\u3059\u3002React\u30fbVue\u30fbSvelte\u306a\u3069\u3092\u81ea\u7531\u306b\u7d44\u307f\u5408\u308f\u305b\u3089\u308c\u3001\u30da\u30fc\u30b8\u5358\u4f4d\u3067\u9759\u7684\u751f\u6210\u3068SSR\u3092\u9078\u629e\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u6a5f\u80fd\u306e\u8a2d\u8a08<\/h2>\n\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-14.48.08.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u691c\u7d22\u6a5f\u80fd\u3092\u4f5c\u308b\u524d\u306b\u3001\u3069\u3093\u306a\u8a2d\u8a08\u306b\u3059\u308c\u3070\u826f\u3044\u3067\u3059\u304b\uff1f<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.11.23.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u307e\u305a\u306f\u5168\u4f53\u306e\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u3092\u7406\u89e3\u3059\u308b\u3093\u3058\u3083\uff01\u30e6\u30fc\u30b6\u30fc\u306e\u691c\u7d22\u30af\u30a8\u30ea\u3092\u3069\u3046\u51e6\u7406\u3057\u3001\u7d50\u679c\u3092\u3069\u3046\u8868\u793a\u3059\u308b\u304b\u3001\u5168\u4f53\u306e\u6d41\u308c\u3092\u628a\u63e1\u3059\u308b\u3053\u3068\u304c\u5927\u5207\u3058\u3083\u305e<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u691c\u7d22\u6a5f\u80fd\u306e\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u691c\u7d22\u30d5\u30a9\u30fc\u30e0\u306e\u5165\u529b<\/strong>\uff1a\u30e6\u30fc\u30b6\u30fc\u304c\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u5165\u529b<\/li>\n<li><strong>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/strong>\uff1aZod\u3067\u5165\u529b\u5024\u3092\u691c\u8a3c<\/li>\n<li><strong>\u30da\u30fc\u30b8\u9077\u79fb<\/strong>\uff1a\u30af\u30a8\u30ea\u30d1\u30e9\u30e1\u30fc\u30bf\u4ed8\u304d\u3067\u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u3078<\/li>\n<li><strong>SSR\u3067API\u30ea\u30af\u30a8\u30b9\u30c8<\/strong>\uff1a\u30b5\u30fc\u30d0\u30fc\u5074\u3067WordPress REST API\u3092\u547c\u3073\u51fa\u3057<\/li>\n<li><strong>\u7d50\u679c\u306e\u53d6\u5f97\u30fb\u51e6\u7406<\/strong>\uff1a\u691c\u7d22\u7d50\u679c\u3092\u53d6\u5f97\u3057\u3066\u51e6\u7406<\/li>\n<li><strong>\u7d50\u679c\u306e\u8868\u793a<\/strong>\uff1a\u691c\u7d22\u7d50\u679c\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f7f\u7528\u3059\u308b\u6280\u8853\u30b9\u30bf\u30c3\u30af<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u5f79\u5272<\/th><th>\u6280\u8853<\/th><\/tr><\/thead><tbody><tr><td>\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\uff08CMS\uff09<\/td><td>WordPress\uff08\u30d8\u30c3\u30c9\u30ec\u30b9\uff09<\/td><\/tr><tr><td>API<\/td><td>WordPress REST API<\/td><\/tr><tr><td>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9<\/td><td>Astro<\/td><\/tr><tr><td>UI\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/td><td>React\uff08\u90e8\u5206\u7684\u306b\u4f7f\u7528\uff09<\/td><\/tr><tr><td>\u30d5\u30a9\u30fc\u30e0\u7ba1\u7406<\/td><td>React Hook Form<\/td><\/tr><tr><td>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/td><td>Zod<\/td><\/tr><tr><td>\u30b9\u30bf\u30a4\u30ea\u30f3\u30b0<\/td><td>Tailwind CSS<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d71\uff1a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h2>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code># Astro\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\nnpm create astro@latest my-headless-site\n\n# \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\ncd my-headless-site\n\n# \u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nnpm install\n\n# React\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\nnpx astro add react\n\n# Tailwind CSS\u3092\u8ffd\u52a0\nnpx astro add tailwind\n\n# \u305d\u306e\u4ed6\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nnpm install react-hook-form zod @hookform\/resolvers<\/code><\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a<\/h3>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-none\" data-lang=\"Code\"><code># .env\n# WordPress REST API\u306e\u30d9\u30fc\u30b9URL\nPUBLIC_WP_API_URL=https:\/\/your-wordpress-site.com\/wp-json\/wp\/v2\n\n# 1\u30da\u30fc\u30b8\u3042\u305f\u308a\u306e\u8868\u793a\u4ef6\u6570\nPUBLIC_POSTS_PER_PAGE=10<\/code><\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Astro\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u8abf\u6574<\/h3>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-javascript\" data-lang=\"JavaScript\"><code>\/\/ astro.config.mjs\nimport { defineConfig } from 'astro\/config';\nimport react from '@astrojs\/react';\nimport tailwind from '@astrojs\/tailwind';\n\nexport default defineConfig({\n  integrations: [react(), tailwind()],\n  output: 'hybrid', \/\/ \u90e8\u5206\u7684SSR\u3092\u6709\u52b9\u5316\n});<\/code><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d72\uff1aWordPress REST API\u306e\u7406\u89e3\u3068\u6d3b\u7528<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u691c\u7d22\u306b\u4f7f\u3048\u308b\u4e3b\u8981\u30d1\u30e9\u30e1\u30fc\u30bf<\/h3>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-none\" data-lang=\"Code\"><code># \u6295\u7a3f\u4e00\u89a7\u3092\u53d6\u5f97\nGET \/wp-json\/wp\/v2\/posts\n\n# \u691c\u7d22\u30d1\u30e9\u30e1\u30fc\u30bf\u4ed8\u304d\u3067\u53d6\u5f97\nGET \/wp-json\/wp\/v2\/posts?search=\u30ad\u30fc\u30ef\u30fc\u30c9\n\n# \u30ab\u30c6\u30b4\u30ea\u30fc\u3067\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\nGET \/wp-json\/wp\/v2\/posts?categories=1,2\n\n# \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\nGET \/wp-json\/wp\/v2\/posts?page=1&amp;per_page=10\n\n# \u4e26\u3073\u9806\nGET \/wp-json\/wp\/v2\/posts?orderby=date&amp;order=desc<\/code><\/pre><\/div>\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30d1\u30e9\u30e1\u30fc\u30bf<\/th><th>\u8aac\u660e<\/th><th>\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>search<\/td><td>\u30bf\u30a4\u30c8\u30eb\u30fb\u672c\u6587\u304b\u3089\u691c\u7d22<\/td><td>search=WordPress<\/td><\/tr><tr><td>categories<\/td><td>\u30ab\u30c6\u30b4\u30ea\u30fcID<\/td><td>categories=1,5<\/td><\/tr><tr><td>tags<\/td><td>\u30bf\u30b0ID<\/td><td>tags=10,20<\/td><\/tr><tr><td>author<\/td><td>\u8457\u8005ID<\/td><td>author=2<\/td><\/tr><tr><td>orderby<\/td><td>\u4e26\u3073\u9806\u306e\u57fa\u6e96<\/td><td>orderby=date<\/td><\/tr><tr><td>order<\/td><td>\u6607\u9806\/\u964d\u9806<\/td><td>order=asc<\/td><\/tr><tr><td>page<\/td><td>\u30da\u30fc\u30b8\u756a\u53f7<\/td><td>page=2<\/td><\/tr><tr><td>per_page<\/td><td>1\u30da\u30fc\u30b8\u3042\u305f\u308a\u306e\u4ef6\u6570<\/td><td>per_page=20<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">API\u30e9\u30c3\u30d1\u30fc\u95a2\u6570\u306e\u4f5c\u6210<\/h3>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-typescript\" data-lang=\"TypeScript\"><code>\/\/ src\/lib\/wordpress.ts\nconst WP_API_URL = import.meta.env.PUBLIC_WP_API_URL;\n\nexport type Post = {\n  id: number;\n  date: string;\n  title: {\n    rendered: string;\n  };\n  content: {\n    rendered: string;\n  };\n  excerpt: {\n    rendered: string;\n  };\n  link: string;\n  slug: string;\n  categories: number[];\n  tags: number[];\n  _embedded?: {\n    'wp:featuredmedia'?: Array&lt;{\n      source_url: string;\n      alt_text: string;\n    }&gt;;\n  };\n};\n\nexport type SearchParams = {\n  search?: string;\n  categories?: string;\n  tags?: string;\n  page?: number;\n  perPage?: number;\n  orderby?: 'date' | 'relevance' | 'title';\n  order?: 'asc' | 'desc';\n};\n\nexport async function searchPosts(params: SearchParams = {}) {\n  const {\n    search = '',\n    categories = '',\n    tags = '',\n    page = 1,\n    perPage = 10,\n    orderby = 'date',\n    order = 'desc',\n  } = params;\n\n  \/\/ \u30af\u30a8\u30ea\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u69cb\u7bc9\n  const queryParams = new URLSearchParams({\n    _embed: 'true', \/\/ \u30a2\u30a4\u30ad\u30e3\u30c3\u30c1\u753b\u50cf\u3092\u542b\u3081\u308b\n    page: page.toString(),\n    per_page: perPage.toString(),\n    orderby,\n    order,\n  });\n\n  \/\/ \u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u304c\u3042\u308b\u5834\u5408\u306e\u307f\u8ffd\u52a0\n  if (search) {\n    queryParams.append('search', search);\n  }\n\n  \/\/ \u30ab\u30c6\u30b4\u30ea\u30fc\u304c\u3042\u308b\u5834\u5408\u306e\u307f\u8ffd\u52a0\n  if (categories) {\n    queryParams.append('categories', categories);\n  }\n\n  \/\/ \u30bf\u30b0\u304c\u3042\u308b\u5834\u5408\u306e\u307f\u8ffd\u52a0\n  if (tags) {\n    queryParams.append('tags', tags);\n  }\n\n  const url = `${WP_API_URL}\/posts?${queryParams.toString()}`;\n\n  try {\n    const response = await fetch(url);\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    const posts: Post[] = await response.json();\n\n    \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc\u304b\u3089\u7dcf\u4ef6\u6570\u3092\u53d6\u5f97\n    const totalPosts = parseInt(\n      response.headers.get('X-WP-Total') || '0',\n      10\n    );\n    const totalPages = parseInt(\n      response.headers.get('X-WP-TotalPages') || '0',\n      10\n    );\n\n    return {\n      posts,\n      totalPosts,\n      totalPages,\n      currentPage: page,\n    };\n  } catch (error) {\n    console.error('Error fetching posts:', error);\n    return {\n      posts: [],\n      totalPosts: 0,\n      totalPages: 0,\n      currentPage: page,\n    };\n  }\n}\n\n\/\/ \u30ab\u30c6\u30b4\u30ea\u30fc\u4e00\u89a7\u3092\u53d6\u5f97\nexport async function getCategories() {\n  const url = `${WP_API_URL}\/categories?per_page=100`;\n\n  try {\n    const response = await fetch(url);\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return await response.json();\n  } catch (error) {\n    console.error('Error fetching categories:', error);\n    return [];\n  }\n}<\/code><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d73\uff1a\u691c\u7d22\u30d5\u30a9\u30fc\u30e0\u306e\u5b9f\u88c5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">React Hook Form\u3068Zod\u3092\u4f7f\u3063\u305f\u578b\u5b89\u5168\u306a\u691c\u7d22\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-markup\" data-lang=\"HTML\"><code>\/\/ src\/components\/SearchForm.tsx\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform\/resolvers\/zod';\nimport { z } from 'zod';\n\n\/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30b9\u30ad\u30fc\u30de\u306e\u5b9a\u7fa9\nconst searchSchema = z.object({\n  q: z\n    .string()\n    .min(1, '\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044')\n    .max(100, '\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u306f100\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044'),\n});\n\ntype SearchFormData = z.infer&lt;typeof searchSchema&gt;;\n\nexport function SearchForm({ defaultValue = '' }: { defaultValue?: string }) {\n  const {\n    register,\n    handleSubmit,\n    formState: { errors, isSubmitting },\n  } = useForm&lt;SearchFormData&gt;({\n    resolver: zodResolver(searchSchema),\n    defaultValues: {\n      q: defaultValue,\n    },\n  });\n\n  const onSubmit = (data: SearchFormData) =&gt; {\n    \/\/ \u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u3078\u9077\u79fb\n    window.location.href = `\/search?q=${encodeURIComponent(data.q)}`;\n  };\n\n  return (\n    &lt;form onSubmit={handleSubmit(onSubmit)} className=\"w-full max-w-2xl\"&gt;\n      &lt;div className=\"relative\"&gt;\n        &lt;input\n          type=\"text\"\n          {...register('q')}\n          placeholder=\"\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u5165\u529b...\"\n          className=\"w-full px-4 py-3 pr-12 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500\"\n          aria-label=\"\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\"\n        \/&gt;\n\n        &lt;button\n          type=\"submit\"\n          disabled={isSubmitting}\n          className=\"absolute right-2 top-1\/2 -translate-y-1\/2 px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 disabled:bg-gray-400 transition-colors\"\n          aria-label=\"\u691c\u7d22\"\n        &gt;\n          {isSubmitting ? (\n            &lt;svg\n              className=\"animate-spin h-5 w-5\"\n              xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n              fill=\"none\"\n              viewBox=\"0 0 24 24\"\n            &gt;\n              &lt;circle\n                className=\"opacity-25\"\n                cx=\"12\"\n                cy=\"12\"\n                r=\"10\"\n                stroke=\"currentColor\"\n                strokeWidth=\"4\"\n              \/&gt;\n              &lt;path\n                className=\"opacity-75\"\n                fill=\"currentColor\"\n                d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n              \/&gt;\n            &lt;\/svg&gt;\n          ) : (\n            &lt;svg\n              className=\"h-5 w-5\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              viewBox=\"0 0 24 24\"\n            &gt;\n              &lt;path\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                strokeWidth={2}\n                d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n              \/&gt;\n            &lt;\/svg&gt;\n          )}\n        &lt;\/button&gt;\n      &lt;\/div&gt;\n\n      {errors.q &amp;&amp; (\n        &lt;p className=\"mt-2 text-sm text-red-600\" role=\"alert\"&gt;\n          {errors.q.message}\n        &lt;\/p&gt;\n      )}\n    &lt;\/form&gt;\n  );\n}<\/code><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d74\uff1a\u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u306e\u5b9f\u88c5\uff08SSR\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><span class=\"swl-marker mark_yellow\">\u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u306f\u52d5\u7684\u306b\u30af\u30a8\u30ea\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u51e6\u7406\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u305f\u3081\u3001SSR\u3092\u6709\u52b9\u306b\u3057\u307e\u3059\u3002<\/span><\/strong><code>export const prerender = false<\/code>\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u30d3\u30eb\u30c9\u6642\u306b\u9759\u7684\u5316\u3055\u308c\u305a\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u3054\u3068\u306b\u52d5\u7684\u306b\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-markup\" data-lang=\"HTML\"><code>---\n\/\/ src\/pages\/search.astro\n\n\/\/ \u3053\u306e\u30da\u30fc\u30b8\u306e\u307fSSR\u3092\u6709\u52b9\u5316\nexport const prerender = false;\n\nimport Layout from '..\/layouts\/Layout.astro';\nimport { SearchForm } from '..\/components\/SearchForm';\nimport { searchPosts } from '..\/lib\/wordpress';\n\n\/\/ URL\u304b\u3089\u30af\u30a8\u30ea\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u53d6\u5f97\nconst url = new URL(Astro.request.url);\nconst searchParams = new URLSearchParams(url.search);\n\nconst keyword = searchParams.get('q') || '';\nconst page = parseInt(searchParams.get('page') || '1', 10);\nconst categories = searchParams.get('categories') || '';\n\n\/\/ WordPress REST API\u3067\u691c\u7d22\u5b9f\u884c\nconst { posts, totalPosts, totalPages, currentPage } = await searchPosts({\n  search: keyword,\n  categories,\n  page,\n  perPage: 10,\n  orderby: keyword ? 'relevance' : 'date',\n});\n---\n\n&lt;Layout title={`\u691c\u7d22\u7d50\u679c: ${keyword || '\u3059\u3079\u3066\u306e\u8a18\u4e8b'}`}&gt;\n  &lt;div class=\"container mx-auto px-4 py-8\"&gt;\n    &lt;h1 class=\"text-3xl font-bold mb-8\"&gt;\n      {keyword ? `\"${keyword}\" \u306e\u691c\u7d22\u7d50\u679c` : '\u3059\u3079\u3066\u306e\u8a18\u4e8b'}\n    &lt;\/h1&gt;\n\n    &lt;!-- \u691c\u7d22\u30d5\u30a9\u30fc\u30e0 --&gt;\n    &lt;div class=\"mb-8\"&gt;\n      &lt;SearchForm client:load defaultValue={keyword} \/&gt;\n    &lt;\/div&gt;\n\n    &lt;!-- \u691c\u7d22\u7d50\u679c\u306e\u4ef6\u6570\u8868\u793a --&gt;\n    {totalPosts &gt; 0 &amp;&amp; (\n      &lt;p class=\"text-gray-600 mb-6\"&gt;\n        {totalPosts}\u4ef6\u306e\u8a18\u4e8b\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\n      &lt;\/p&gt;\n    )}\n\n    &lt;!-- \u691c\u7d22\u7d50\u679c\u306e\u8868\u793a --&gt;\n    {posts.length &gt; 0 ? (\n      &lt;div class=\"space-y-6\"&gt;\n        {posts.map((post) =&gt; (\n          &lt;article\n            key={post.id}\n            class=\"bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition-shadow\"\n          &gt;\n            &lt;!-- \u30a2\u30a4\u30ad\u30e3\u30c3\u30c1\u753b\u50cf --&gt;\n            {post._embedded?.['wp:featuredmedia']?.[0] &amp;&amp; (\n              &lt;img\n                src={post._embedded['wp:featuredmedia'][0].source_url}\n                alt={post._embedded['wp:featuredmedia'][0].alt_text}\n                class=\"w-full h-48 object-cover rounded-lg mb-4\"\n                loading=\"lazy\"\n              \/&gt;\n            )}\n\n            &lt;!-- \u30bf\u30a4\u30c8\u30eb --&gt;\n            &lt;h2 class=\"text-2xl font-bold mb-2\"&gt;\n              &lt;a\n                href={`\/posts\/${post.slug}`}\n                class=\"text-blue-600 hover:text-blue-800 transition-colors\"\n                set:html={post.title.rendered}\n              \/&gt;\n            &lt;\/h2&gt;\n\n            &lt;!-- \u6295\u7a3f\u65e5 --&gt;\n            &lt;time class=\"text-sm text-gray-500 mb-4 block\"&gt;\n              {new Date(post.date).toLocaleDateString('ja-JP', {\n                year: 'numeric',\n                month: 'long',\n                day: 'numeric',\n              })}\n            &lt;\/time&gt;\n\n            &lt;!-- \u629c\u7c8b --&gt;\n            &lt;div\n              class=\"text-gray-700 line-clamp-3\"\n              set:html={post.excerpt.rendered}\n            \/&gt;\n\n            &lt;!-- \u7d9a\u304d\u3092\u8aad\u3080\u30ea\u30f3\u30af --&gt;\n            &lt;a\n              href={`\/posts\/${post.slug}`}\n              class=\"inline-block mt-4 text-blue-600 hover:text-blue-800 font-semibold\"\n            &gt;\n              \u7d9a\u304d\u3092\u8aad\u3080 \u2192\n            &lt;\/a&gt;\n          &lt;\/article&gt;\n        ))}\n      &lt;\/div&gt;\n    ) : (\n      &lt;!-- \u691c\u7d22\u7d50\u679c\u304c0\u4ef6\u306e\u5834\u5408 --&gt;\n      &lt;div class=\"text-center py-16\"&gt;\n        &lt;svg\n          class=\"mx-auto h-16 w-16 text-gray-400 mb-4\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          viewBox=\"0 0 24 24\"\n        &gt;\n          &lt;path\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            stroke-width=\"2\"\n            d=\"M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n          \/&gt;\n        &lt;\/svg&gt;\n        &lt;h2 class=\"text-2xl font-semibold text-gray-700 mb-2\"&gt;\n          \u8a18\u4e8b\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\n        &lt;\/h2&gt;\n        &lt;p class=\"text-gray-500\"&gt;\n          \u5225\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u3067\u691c\u7d22\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\n        &lt;\/p&gt;\n      &lt;\/div&gt;\n    )}\n\n    &lt;!-- \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3 --&gt;\n    {totalPages &gt; 1 &amp;&amp; (\n      &lt;nav class=\"mt-12 flex justify-center\" aria-label=\"\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\"&gt;\n        &lt;ul class=\"flex gap-2\"&gt;\n          {currentPage &gt; 1 &amp;&amp; (\n            &lt;li&gt;\n              &lt;a\n                href={`\/search?q=${keyword}&amp;page=${currentPage - 1}${\n                  categories ? `&amp;categories=${categories}` : ''\n                }`}\n                class=\"px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50\"\n              &gt;\n                \u524d\u3078\n              &lt;\/a&gt;\n            &lt;\/li&gt;\n          )}\n\n          {Array.from({ length: totalPages }, (_, i) =&gt; i + 1).map(\n            (pageNum) =&gt; (\n              &lt;li key={pageNum}&gt;\n                {pageNum === currentPage ? (\n                  &lt;span class=\"px-4 py-2 bg-blue-500 text-white rounded-md\"&gt;\n                    {pageNum}\n                  &lt;\/span&gt;\n                ) : (\n                  &lt;a\n                    href={`\/search?q=${keyword}&amp;page=${pageNum}${\n                      categories ? `&amp;categories=${categories}` : ''\n                    }`}\n                    class=\"px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50\"\n                  &gt;\n                    {pageNum}\n                  &lt;\/a&gt;\n                )}\n              &lt;\/li&gt;\n            )\n          )}\n\n          {currentPage &lt; totalPages &amp;&amp; (\n            &lt;li&gt;\n              &lt;a\n                href={`\/search?q=${keyword}&amp;page=${currentPage + 1}${\n                  categories ? `&amp;categories=${categories}` : ''\n                }`}\n                class=\"px-4 py-2 border border-gray-300 rounded-md hover:bg-gray-50\"\n              &gt;\n                \u6b21\u3078\n              &lt;\/a&gt;\n            &lt;\/li&gt;\n          )}\n        &lt;\/ul&gt;\n      &lt;\/nav&gt;\n    )}\n  &lt;\/div&gt;\n&lt;\/Layout&gt;<\/code><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d75\uff1a\u30ab\u30c6\u30b4\u30ea\u30fc\u30d5\u30a3\u30eb\u30bf\u30fc\u306e\u5b9f\u88c5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u30ab\u30c6\u30b4\u30ea\u30fc\u3084\u30bf\u30b0\u3067\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3067\u304d\u308b\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-markup\" data-lang=\"HTML\"><code>\/\/ src\/components\/SearchFilters.tsx\nimport { useState } from 'react';\n\ntype Category = {\n  id: number;\n  name: string;\n  slug: string;\n};\n\ntype Props = {\n  categories: Category[];\n  selectedCategories: string;\n};\n\nexport function SearchFilters({ categories, selectedCategories }: Props) {\n  const [selected, setSelected] = useState&lt;Set&lt;string&gt;&gt;(\n    new Set(selectedCategories.split(',').filter(Boolean))\n  );\n\n  const handleToggle = (categoryId: string) =&gt; {\n    const newSelected = new Set(selected);\n    if (newSelected.has(categoryId)) {\n      newSelected.delete(categoryId);\n    } else {\n      newSelected.add(categoryId);\n    }\n    setSelected(newSelected);\n  };\n\n  const handleApply = () =&gt; {\n    const params = new URLSearchParams(window.location.search);\n    if (selected.size &gt; 0) {\n      params.set('categories', Array.from(selected).join(','));\n    } else {\n      params.delete('categories');\n    }\n    params.set('page', '1'); \/\/ \u30d5\u30a3\u30eb\u30bf\u30fc\u5909\u66f4\u6642\u306f1\u30da\u30fc\u30b8\u76ee\u306b\u623b\u308b\n    window.location.href = `\/search?${params.toString()}`;\n  };\n\n  return (\n    &lt;div className=\"bg-white rounded-lg shadow-md p-6\"&gt;\n      &lt;h3 className=\"text-lg font-semibold mb-4\"&gt;\u30ab\u30c6\u30b4\u30ea\u30fc\u3067\u7d5e\u308a\u8fbc\u307f&lt;\/h3&gt;\n\n      &lt;div className=\"space-y-2 mb-4\"&gt;\n        {categories.map((category) =&gt; (\n          &lt;label\n            key={category.id}\n            className=\"flex items-center gap-2 cursor-pointer hover:bg-gray-50 p-2 rounded\"\n          &gt;\n            &lt;input\n              type=\"checkbox\"\n              checked={selected.has(category.id.toString())}\n              onChange={() =&gt; handleToggle(category.id.toString())}\n              className=\"w-4 h-4 text-blue-600 rounded focus:ring-blue-500\"\n            \/&gt;\n            &lt;span className=\"text-gray-700\"&gt;{category.name}&lt;\/span&gt;\n          &lt;\/label&gt;\n        ))}\n      &lt;\/div&gt;\n\n      &lt;button\n        onClick={handleApply}\n        className=\"w-full px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors\"\n      &gt;\n        \u7d5e\u308a\u8fbc\u3080\n      &lt;\/button&gt;\n    &lt;\/div&gt;\n  );\n}<\/code><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/h3>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-typescript\" data-lang=\"TypeScript\"><code>\/\/ src\/lib\/wordpress.ts\uff08\u30ad\u30e3\u30c3\u30b7\u30e5\u7248\uff09\nconst CACHE_DURATION = 60 * 5; \/\/ 5\u5206\n\nconst cache = new Map&lt;string, { data: any; timestamp: number }&gt;();\n\nasync function fetchWithCache(url: string) {\n  const cached = cache.get(url);\n  const now = Date.now();\n\n  \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u6709\u52b9\u306a\u5834\u5408\u306f\u8fd4\u3059\n  if (cached &amp;&amp; now - cached.timestamp &lt; CACHE_DURATION * 1000) {\n    return cached.data;\n  }\n\n  \/\/ API\u30ea\u30af\u30a8\u30b9\u30c8\n  const response = await fetch(url);\n  const data = await response.json();\n\n  \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u4fdd\u5b58\n  cache.set(url, { data, timestamp: now });\n\n  return data;\n}<\/code><\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">2. \u9045\u5ef6\u8aad\u307f\u8fbc\u307f\u306e\u5b9f\u88c5<\/h3>\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-none\" data-lang=\"Code\"><code>&lt;!-- \u753b\u50cf\u306e\u9045\u5ef6\u8aad\u307f\u8fbc\u307f --&gt;\n&lt;img\n  src={imageUrl}\n  alt={altText}\n  loading=\"lazy\"\n  decoding=\"async\"\n  class=\"w-full h-48 object-cover\"\n\/&gt;<\/code><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.06.05.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3067\u306e\u691c\u7d22\u5b9f\u88c5\u3001\u3060\u3044\u3076\u308f\u304b\u3063\u3066\u304d\u307e\u3057\u305f\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.12.07.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u305d\u306e\u8abf\u5b50\u3058\u3083\uff01\u6700\u521d\u306f\u30b7\u30f3\u30d7\u30eb\u306a\u691c\u7d22\u304b\u3089\u59cb\u3081\u3066\u3001\u5f90\u3005\u306b\u30d5\u30a3\u30eb\u30bf\u30fc\u6a5f\u80fd\u3084\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3057\u3066\u3044\u304f\u3068\u826f\u3044\u305e\u3002\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u3092\u7b2c\u4e00\u306b\u8003\u3048\u308b\u3053\u3068\u304c\u5927\u5207\u3058\u3083\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-14.48.08.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u308f\u304b\u308a\u307e\u3057\u305f\uff01\u65e9\u901f\u81ea\u5206\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u5b9f\u88c5\u3057\u3066\u307f\u307e\u3059\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u3088\u304f\u3042\u308b\u8cea\u554f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">WordPress REST API\u306e\u691c\u7d22\u306f\u65e5\u672c\u8a9e\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u304b\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u306f\u3044\u3001\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u65e5\u672c\u8a9e\u306e\u5834\u5408\u306fURL\u30a8\u30f3\u30b3\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059\u3002JavaScript\u306e<code>encodeURIComponent()<\/code>\u3092\u4f7f\u7528\u3057\u3066\u691c\u7d22\u30af\u30a8\u30ea\u3092\u30a8\u30f3\u30b3\u30fc\u30c9\u3059\u308c\u3070\u6b63\u3057\u304f\u52d5\u4f5c\u3057\u307e\u3059\u3002\u307e\u305f\u3001WordPress\u5074\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6587\u5b57\u30b3\u30fc\u30c9\u304cUTF-8\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Astro\u306e\u30cf\u30a4\u30d6\u30ea\u30c3\u30c9\u30e2\u30fc\u30c9\u3068\u306f\u4f55\u3067\u3059\u304b\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Astro\u306e<code>output: 'hybrid'<\/code>\u306f\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u5168\u30da\u30fc\u30b8\u3092\u9759\u7684\u751f\u6210\uff08SSG\uff09\u3057\u3064\u3064\u3001<code>export const prerender = false<\/code>\u3092\u6307\u5b9a\u3057\u305f\u30da\u30fc\u30b8\u306e\u307fSSR\uff08\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\uff09\u3067\u52d5\u7684\u306b\u51e6\u7406\u3059\u308b\u30e2\u30fc\u30c9\u3067\u3059\u3002\u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u306e\u3088\u3046\u306bURL\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u5fdc\u3058\u3066\u5185\u5bb9\u304c\u5909\u308f\u308b\u30da\u30fc\u30b8\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u691c\u7d22\u306e\u7cbe\u5ea6\u3092\u4e0a\u3052\u308b\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3088\u3044\u3067\u3059\u304b\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress REST API\u306e\u6a19\u6e96\u691c\u7d22\u306f\u30bf\u30a4\u30c8\u30eb\u3068\u672c\u6587\u306e\u307f\u5bfe\u8c61\u3067\u3059\u3002\u3088\u308a\u9ad8\u5ea6\u306a\u5168\u6587\u691c\u7d22\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001Elasticsearch\u3068\u300cElasticPress\u300d\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u7d44\u307f\u5408\u308f\u305b\u3084\u3001Algolia\u3068\u306e\u9023\u643a\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001<code>orderby=relevance<\/code>\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u3068\u306e\u95a2\u9023\u5ea6\u9806\u306b\u4e26\u3073\u66ff\u3048\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u30d8\u30c3\u30c9\u30ec\u30b9\u69cb\u6210\u3067WordPress\u306eSEO\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u4f7f\u3048\u307e\u3059\u304b\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yoast SEO\u3084Rank Math\u306a\u3069\u306eSEO\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3067\u6a5f\u80fd\u3057\u3001REST API\u3092\u901a\u3058\u3066\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002Yoast SEO\u306e\u5834\u5408\u3001<code>?_fields=yoast_head_json<\/code>\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067SEO\u30e1\u30bf\u30c7\u30fc\u30bf\u3092JSON\u5f62\u5f0f\u3067\u53d6\u5f97\u3067\u304d\u3001\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u306eAstro\u3067\u5229\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vercel\u3084Netlify\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u306f\u3067\u304d\u307e\u3059\u304b\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u80fd\u3067\u3059\u3002Astro\u306fVercel\u30fbNetlify\u30fbCloudflare Pages\u306b\u516c\u5f0f\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002SSR\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u305d\u308c\u305e\u308c\u306e\u30a2\u30c0\u30d7\u30bf\u30fc\uff08<code>@astrojs\/vercel<\/code>\u7b49\uff09\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u74b0\u5883\u5909\u6570\u306f\u30c7\u30d7\u30ed\u30a4\u5148\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3067\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u307e\u3068\u3081<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u8a18\u4e8b\u3067\u306f\u3001\u30d8\u30c3\u30c9\u30ec\u30b9CMS\uff08WordPress\uff09\u3068Astro\u3092\u4f7f\u3063\u305f\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u3001\u57fa\u790e\u304b\u3089\u5fdc\u7528\u307e\u3067\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u306e\u7406\u89e3<\/strong>\uff1a\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3068\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3092\u5206\u96e2\u3057\u3001\u67d4\u8edf\u3067\u9ad8\u901f\u306a\u958b\u767a\u304c\u53ef\u80fd\u306b\u306a\u308b<\/li>\n<li><strong>WordPress REST API<\/strong>\uff1asearch\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u30bf\u30a4\u30c8\u30eb\u30fb\u672c\u6587\u304b\u3089\u691c\u7d22\u3001X-WP-Total\u30d8\u30c3\u30c0\u30fc\u3067\u7dcf\u4ef6\u6570\u53d6\u5f97<\/li>\n<li><strong>Astro\u306e\u30cf\u30a4\u30d6\u30ea\u30c3\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0<\/strong>\uff1a\u691c\u7d22\u30da\u30fc\u30b8\u306e\u307f<code>prerender = false<\/code>\u3067SSR\u3092\u6709\u52b9\u5316\u3059\u308b<\/li>\n<li><strong>\u578b\u5b89\u5168\u6027\u306e\u78ba\u4fdd<\/strong>\uff1aZod\u306b\u3088\u308b\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3001TypeScript\u3067\u5805\u7262\u306a\u5b9f\u88c5\u3092\u5b9f\u73fe\u3059\u308b<\/li>\n<li><strong>UX\u91cd\u8996\u306e\u5b9f\u88c5<\/strong>\uff1a\u30ed\u30fc\u30c7\u30a3\u30f3\u30b0\u8868\u793a\u30fb\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u30fb\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u3092\u5fc5\u305a\u5b9f\u88c5\u3059\u308b<\/li>\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong>\uff1a5\u5206\u30ad\u30e3\u30c3\u30b7\u30e5\u30fb\u753b\u50cf\u306e\u9045\u5ef6\u8aad\u307f\u8fbc\u307f\u3067API\u30b3\u30fc\u30eb\u3092\u524a\u6e1b\u3059\u308b<\/li>\n<li><strong>\u62e1\u5f35\u6027<\/strong>\uff1a\u30ab\u30c6\u30b4\u30ea\u30fc\u30d5\u30a3\u30eb\u30bf\u30fc\u30fb\u30bf\u30b0\u30d5\u30a3\u30eb\u30bf\u30fc\u30fb\u4e26\u3073\u66ff\u3048\u306e\u8ffd\u52a0\u304c\u5bb9\u6613\u306a\u8a2d\u8a08\u306b\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><span class=\"swl-marker mark_yellow\">WithCode\u3067\u5b66\u3093\u3060Web\u5236\u4f5c\u306e\u57fa\u790e\u77e5\u8b58\u306b\u3001\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u306e\u6280\u8853\u3092\u7d44\u307f\u5408\u308f\u305b\u308c\u3070\u3001\u9ad8\u901f\u3067\u67d4\u8edf\u306a\u30e2\u30c0\u30f3Web\u30b5\u30a4\u30c8\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/span><\/strong>\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3068\u30e2\u30c0\u30f3\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u7d44\u307f\u5408\u308f\u305b\u306f\u3001\u4eca\u5f8c\u307e\u3059\u307e\u3059\u4e3b\u6d41\u306b\u306a\u3063\u3066\u3044\u304d\u307e\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3092\u53c2\u8003\u306b\u3001\u305c\u3072\u3042\u306a\u305f\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3082\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3092\u6d3b\u7528\u3057\u305f\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u3092\u5b9f\u88c5\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<!-- withmedia-related -->\n<h2 class=\"wp-block-heading\">\u95a2\u9023\u8a18\u4e8b<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/withcode.tech\/media\/webfont_subset_performance\/\">Web\u30d5\u30a9\u30f3\u30c8\u6700\u9069\u5316\u30102026\u5e74\u7248\u3011\u30b5\u30d6\u30bb\u30c3\u30c8\u5316\u3067\u8aad\u307f\u8fbc\u307f\u901f\u5ea6\u3092\u5287\u7684\u6539\u5584<\/a><\/li>\n<li><a href=\"https:\/\/withcode.tech\/media\/headless_cms\/\">\u30d8\u30c3\u30c9\u30ec\u30b9CMS \u30d7\u30ec\u30d3\u30e5\u30fc\u74b0\u5883\u69cb\u7bc9\u30102026\u5e74\u5b8c\u5168\u30ac\u30a4\u30c9\u3011<\/a><\/li>\n<li><a href=\"https:\/\/withcode.tech\/media\/engineer_hard_work\">\u3010\u30a8\u30f3\u30b8\u30cb\u30a2\u3011\u304d\u3064\u304f\u3066\u5927\u5909\uff01\u514b\u670d\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\uff01<\/a><\/li>\n<li><a href=\"https:\/\/withcode.tech\/media\/web_product_develop_difference\">\u3010\u3053\u3093\u306a\u306b\u9055\u3046\uff01\u3011Web\u5236\u4f5c\u3068Web\u958b\u767a\u306e\u9055\u3044\u3092\u6bd4\u8f03\uff01<\/a><\/li>\n<li><a href=\"https:\/\/withcode.tech\/media\/web-engineer-future\/\">\u3010\u73fe\u5f79IT\u30a8\u30f3\u30b8\u30cb\u30a2\u304c\u89e3\u8aac\u3011Web\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u5c06\u6765\u306f\uff1f\u958b\u767a\u73fe\u5834\u306e\u73fe\u72b6\u3082\u5408\u308f\u305b\u3066\u89e3\u8aac\uff01<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<!-- withmedia-references -->\n<h2 class=\"wp-block-heading\">\u53c2\u8003\u30ea\u30f3\u30af\uff08\u516c\u5f0f\u30fb\u4e00\u6b21\u60c5\u5831\uff09<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/ja.wordpress.org\/support\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress \u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a><\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/ja\/docs\/Web\/JavaScript\" target=\"_blank\" rel=\"noopener noreferrer\">MDN Web Docs \u2014 JavaScript<\/a><\/li>\n<li><a href=\"https:\/\/ja.react.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">React \u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data?hl=ja\" target=\"_blank\" rel=\"noopener noreferrer\">Google \u691c\u7d22\u30bb\u30f3\u30c8\u30e9\u30eb \u2014 \u69cb\u9020\u5316\u30c7\u30fc\u30bf<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">WithCode\u3092\u4f53\u9a13\u3067\u304d\u308b\u521d\u7d1a\u30b3\u30fc\u30b9\u516c\u958b\u4e2d\uff01<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2024\/01\/withcode-beginner-course.jpg\" alt=\"WithCode\u521d\u7d1a\u30b3\u30fc\u30b9\" class=\"wp-image-12345\"\/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">\u521d\u7d1a\u30b3\u30fc\u30b9\uff08\u00a549,800\uff09\u304c\u5b8c\u5168\u7121\u6599\u306b\uff01<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u671f\u9593\uff1a<\/strong>1\u9031\u9593<\/li>\n<li><strong>\u5b66\u7fd2\u5185\u5bb9\uff1a<\/strong>\u30ed\u30fc\u30c9\u30de\u30c3\u30d7\/\u57fa\u790e\u77e5\u8b58\/\u74b0\u5883\u69cb\u7bc9\/HTML\/CSS\/LP\u30fb\u30dd\u30fc\u30c8\u30d5\u30a9\u30ea\u30aa\u4f5c\u6210<br><strong><span class=\"swl-marker mark_yellow\">\u2192 \u6b63\u3057\u3044\u5b66\u7fd2\u65b9\u6cd5\u3067\u300c\u78ba\u304b\u306a\u6210\u9577\u300d\u3092\u5b9f\u611f\u3067\u304d\u308b\u30ab\u30ea\u30ad\u30e5\u30e9\u30e0<\/span><\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u526f\u696d\u30fb\u30d5\u30ea\u30fc\u30e9\u30f3\u30b9\u304c\u4e3b\u6d41\u306b\u306a\u3063\u3066\u3044\u308b\u4eca\u3053\u305d\u3001\u81ea\u3089\u306e\u30b9\u30ad\u30eb\u3067\u7a3c\u3052\u308b\u4eba\u6750\u3092\u76ee\u6307\u3057\u3066\u307f\u307e\u305b\u3093\u304b\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u672a\u7d4c\u9a13\u3067\u3082\u5fc3\u914d\u3059\u308b\u3053\u3068\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u521d\u7d1a\u30b3\u30fc\u30b9\u3092\u53d7\u8b1b\u3055\u308c\u308b\u65b9\u306e\u5927\u591a\u6570\u306f\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u672a\u7d4c\u9a13\u3067\u3059\u3002\u307e\u305a\u306f\u7121\u6599\u30ab\u30a6\u30f3\u30bb\u30ea\u30f3\u30b0\u3067\u3001\u60a9\u307f\u3084\u4e0d\u5b89\u3092\u304a\u805e\u304b\u305b\u304f\u3060\u3055\u3044\uff01<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-white-color has-text-color has-background has-link-color wp-element-button\" href=\"https:\/\/withcode.tech\/reservation\/\" style=\"background-color:#ffbf00\"><strong>\u516c\u5f0f\u30b5\u30a4\u30c8\u304b\u3089\u7121\u6599\u30ab\u30a6\u30f3\u30bb\u30ea\u30f3\u30b0\u306b\u7533\u3057\u8fbc\u3080 \u2192<\/strong><\/a><\/div>\n<\/div>\n\n\n\n<!-- withmedia-faq-schema -->\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"WordPress REST API\u306e\u691c\u7d22\u306f\u65e5\u672c\u8a9e\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u304b\uff1f\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"\u306f\u3044\u3001\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u65e5\u672c\u8a9e\u306e\u5834\u5408\u306fURL\u30a8\u30f3\u30b3\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059\u3002JavaScript\u306eencodeURIComponent()\u3092\u4f7f\u7528\u3057\u3066\u691c\u7d22\u30af\u30a8\u30ea\u3092\u30a8\u30f3\u30b3\u30fc\u30c9\u3059\u308c\u3070\u6b63\u3057\u304f\u52d5\u4f5c\u3057\u307e\u3059\u3002\u307e\u305f\u3001WordPress\u5074\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6587\u5b57\u30b3\u30fc\u30c9\u304cUTF-8\u3067\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Astro\u306e\u30cf\u30a4\u30d6\u30ea\u30c3\u30c9\u30e2\u30fc\u30c9\u3068\u306f\u4f55\u3067\u3059\u304b\uff1f\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"stro\u306eoutput: 'hybrid'\u306f\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u5168\u30da\u30fc\u30b8\u3092\u9759\u7684\u751f\u6210\uff08SSG\uff09\u3057\u3064\u3064\u3001export const prerender = false\u3092\u6307\u5b9a\u3057\u305f\u30da\u30fc\u30b8\u306e\u307fSSR\uff08\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\uff09\u3067\u52d5\u7684\u306b\u51e6\u7406\u3059\u308b\u30e2\u30fc\u30c9\u3067\u3059\u3002\u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u306e\u3088\u3046\u306bURL\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u5fdc\u3058\u3066\u5185\u5bb9\u304c\u5909\u308f\u308b\u30da\u30fc\u30b8\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u691c\u7d22\u306e\u7cbe\u5ea6\u3092\u4e0a\u3052\u308b\u306b\u306f\u3069\u3046\u3059\u308c\u3070\u3088\u3044\u3067\u3059\u304b\uff1f\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"WordPress REST API\u306e\u6a19\u6e96\u691c\u7d22\u306f\u30bf\u30a4\u30c8\u30eb\u3068\u672c\u6587\u306e\u307f\u5bfe\u8c61\u3067\u3059\u3002\u3088\u308a\u9ad8\u5ea6\u306a\u5168\u6587\u691c\u7d22\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001Elasticsearch\u3068\u300cElasticPress\u300d\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u7d44\u307f\u5408\u308f\u305b\u3084\u3001Algolia\u3068\u306e\u9023\u643a\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001orderby=relevance\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u691c\u7d22\u30ad\u30fc\u30ef\u30fc\u30c9\u3068\u306e\u95a2\u9023\u5ea6\u9806\u306b\u4e26\u3073\u66ff\u3048\u3067\u304d\u307e\u3059\u3002\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u30d8\u30c3\u30c9\u30ec\u30b9\u69cb\u6210\u3067WordPress\u306eSEO\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u4f7f\u3048\u307e\u3059\u304b\uff1f\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yoast SEO\u3084Rank Math\u306a\u3069\u306eSEO\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3067\u6a5f\u80fd\u3057\u3001REST API\u3092\u901a\u3058\u3066\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002Yoast SEO\u306e\u5834\u5408\u3001?_fields=yoast_head_json\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067SEO\u30e1\u30bf\u30c7\u30fc\u30bf\u3092JSON\u5f62\u5f0f\u3067\u53d6\u5f97\u3067\u304d\u3001\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u306eAstro\u3067\u5229\u7528\u3067\u304d\u307e\u3059\u3002\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Vercel\u3084Netlify\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u306f\u3067\u304d\u307e\u3059\u304b\uff1f\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"\u53ef\u80fd\u3067\u3059\u3002Astro\u306fVercel\u30fbNetlify\u30fbCloudflare Pages\u306b\u516c\u5f0f\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002SSR\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u305d\u308c\u305e\u308c\u306e\u30a2\u30c0\u30d7\u30bf\u30fc\uff08@astrojs\/vercel\u7b49\uff09\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u74b0\u5883\u5909\u6570\u306f\u30c7\u30d7\u30ed\u30a4\u5148\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3067\u8a2d\u5b9a\u3057\u307e\u3059\u3002\"\n      }\n    }\n  ]\n}\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>WordPress\u3092\u30d8\u30c3\u30c9\u30ec\u30b9CMS\u3068\u3057\u3066\u4f7f\u3044Astro\u3067\u30b5\u30a4\u30c8\u5185\u691c\u7d22\u3092\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3002REST API\u30e9\u30c3\u30d1\u30fc\u30fbReact Hook Form+Zod\u306e\u691c\u7d22\u30d5\u30a9\u30fc\u30e0\u30fbSSR\u3092\u4f7f\u3063\u305f\u691c\u7d22\u7d50\u679c\u30da\u30fc\u30b8\u30fb\u30ab\u30c6\u30b4\u30ea\u30fc\u30d5\u30a3\u30eb\u30bf\u30fc\u30fb\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u307e\u3067\u5b9f\u88c5\u30b3\u30fc\u30c9\u4ed8\u304d\u3067\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n","protected":false},"author":2,"featured_media":14308,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"swell_btn_cv_data":"","footnotes":"","vk-ltc-link":"","vk-ltc-target":"0"},"categories":[34,390],"tags":[],"class_list":["post-12622","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","category-cms"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts\/12622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/comments?post=12622"}],"version-history":[{"count":9,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts\/12622\/revisions"}],"predecessor-version":[{"id":16251,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts\/12622\/revisions\/16251"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/media\/14308"}],"wp:attachment":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/media?parent=12622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/categories?post=12622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/tags?post=12622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}