๐ แ แ แแ แแก Headless WordPress?
๐ Headless WordPress แแ แแก แแ แฅแแขแแฅแขแฃแ แฃแแ แแแแแแแ, แกแแแแช WordPress แแแแแแงแแแแแ แ แแแแ แช “แขแ แแแแชแแฃแแ แคแ แแแขแแก แแแ แแจแ” CMS (Content Management System). แแก แแแจแแแแก, แ แแ WordPress-แ แแฃแจแแแแก แแฎแแแแ แแแแขแแแขแแก แแแ แแแแก back-end แกแแกแขแแแแ, แฎแแแ front-end แแแฌแแแ แจแแฅแแแแแแ แกแฎแแ แแแแแแแแ แแแ แขแแฅแแแแแแแแแแ.
๐ แขแ แแแแชแแฃแแ vs Headless WordPress
๐ฅ แขแ แแแแชแแฃแแ WordPress:
- ๐จ แแงแแแแแก PHP แแแแแแก
- ๐ แแแแแแแแฃแ แ แแ แฅแแขแแฅแขแฃแ แ
- ๐ฑ แจแแแฆแฃแแฃแแ แแแฅแแแแแแ
- ๐ แแแแแแแ แกแแฉแฅแแ แ
๐ซ Headless WordPress:
- โก API-first แแแแแแแ
- ๐ แแแฅแแแแ แแ แฅแแขแแฅแขแฃแ แ
- ๐ฑ แแฃแแขแแแแแขแคแแ แแฃแแ
- ๐ แแแฃแแฏแแแแกแแแฃแแ แฌแแ แแแแแแ
๐ ๏ธ Headless WordPress-แแก แแ แฅแแขแแฅแขแฃแ แ
1. ๐ Back-end (WordPress)
// WordPress REST API endpoints
add_action('rest_api_init', function () {
register_rest_route('custom/v1', '/posts', array(
'methods' => 'GET',
'callback' => 'get_custom_posts',
'permission_callback' => '__return_true'
));
});
2. ๐จ Front-end (แแแแแแแแแ React.js)
// React แแแแแแแแแขแแก แแแแแแแแ
const Posts = () => {
const [posts, setPosts] = useState([]);
useEffect(() => {
fetch('your-wordpress-site/wp-json/wp/v2/posts')
.then(response => response.json())
.then(data => setPosts(data));
}, []);
return (
<div className="posts-grid">
{posts.map(post => (
<PostCard key={post.id} post={post} />
))}
</div>
);
};
๐ Headless WordPress-แแก แฃแแแ แแขแแกแแแแแ
1. โก แแแฃแแฏแแแแกแแแฃแแ แฌแแ แแแแแแ
- ๐ แกแฌแ แแคแ แฉแแขแแแ แแแ
- ๐ แแแแแแแ แกแแ แแแ แแก แแแขแแแ แแแ
- ๐ฑ แแแขแแแแแแแฃแแ แแแแแแฃแ แ แแแแแชแแแแแแ
2. ๐ ๏ธ แแแฅแแแแ แแแแแแแแแแแขแ
- ๐ แแแแแแแแ แแแ JavaScript แคแ แแแแแแ แแแแ
- ๐ฑ API-first แแแแแแแ
- ๐จ แแแฅแแแแ UI/UX แแแแแแแ
3. ๐ แแแฃแแฏแแแแกแแแฃแแ แฃแกแแคแ แแฎแแแแ
- ๐ก๏ธ แแแงแแคแแแ แแ แฅแแขแแฅแขแฃแ แ
- ๐ แแแแแแแ แแแฌแงแแแแแแแ
- ๐ซ แจแแแชแแ แแแฃแแ แจแแขแแแแก แแแแแแแ แ
๐ ๏ธ Headless WordPress-แแก แแแแแแแแแขแแชแแ
1. ๐ แแแกแแแแแแแแแแ แกแแแฃแจแแแแแ
WordPress-แแก แแแแคแแแฃแ แแชแแ:
- ๐ฅ แแแแแแกแขแแแแ แแ WordPress
- ๐ง แแแแฅแขแแฃแ แแ REST API
- ๐ แแแแแแแคแแแฃแ แแ แแ CORS
- ๐ แแแแงแแแแ แกแแญแแ แ แแแแแแแแแ
// CORS-แแก แแแแคแแแฃแ แแชแแ functions.php-แจแ
add_action('init', function() {
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Authorization, Content-Type");
});
2. ๐จ Front-end แแแแแแแแแขแแชแแ
Next.js แแแแแแแแ:
// pages/posts/[slug].js
export async function getStaticProps({ params }) {
const post = await fetch(
`${process.env.WORDPRESS_API_URL}/wp-json/wp/v2/posts?slug=${params.slug}`
).then(res => res.json());
return {
props: {
post: post[0],
},
revalidate: 60,
};
}
3. ๐ API แแแขแแแ แแชแแ
Custom Endpoints:
// WordPress-แแก แแฎแแ แแก
function register_custom_endpoints() {
register_rest_route('custom/v1', '/menu', array(
'methods' => 'GET',
'callback' => 'get_custom_menu',
'permission_callback' => '__return_true'
));
}
add_action('rest_api_init', 'register_custom_endpoints');
๐ ๏ธ แแแแฃแแแ แฃแแ Front-end แคแ แแแแแแ แแแแ
1. โ๏ธ Next.js
- ๐ Server-side Rendering
- ๐ Static Site Generation
- ๐ แแแขแแแแขแฃแ แ แแแขแแแแแแชแแ
2. ๐ฏ Gatsby
- ๐ GraphQL แแแขแแแ แแชแแ
- ๐ผ๏ธ แกแฃแ แแแแแแก แแแขแแแแแแชแแ
- ๐ แแแแแแ แ แแแแแแแแแแก แแแแกแแกแขแแแ
3. ๐ซ Nuxt.js (Vue.js)
- ๐จ Vue.js-แแ แแแคแฃแซแแแแฃแแ
- ๐ฑ แฃแแแแแ แกแแแฃแ แ แแแแแแแชแแแแ
- โก แแแขแแแแขแฃแ แ แแแแแก แแแงแแคแ
๐ง แแแแ แชแแแแแฃแแ แแ แแแแแแแแ แแ แแแแแฌแงแแแขแแแ
1. ๐ซ CORS แจแแชแแแแแแ
// WordPress-แแก แแฎแแ แแก CORS-แแก แแแแแฌแงแแแขแ
add_action('rest_api_init', function() {
remove_filter('rest_pre_serve_request', 'rest_send_cors_headers');
add_filter('rest_pre_serve_request', function($value) {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Credentials: true');
return $value;
});
});
2. ๐ แแแจแแ แแแแก แแ แแแแแแแแ
// Front-end แแแจแแ แแแแก แกแขแ แแขแแแแ
export async function getStaticProps() {
const posts = await fetch(`${process.env.WORDPRESS_API_URL}/wp-json/wp/v2/posts`);
return {
props: {
posts: await posts.json(),
},
revalidate: 60, // แ แแแแแแ แแชแแ แงแแแแ 60 แฌแแแจแ
};
}
๐ SEO แแแขแแแแแแชแแ
1. ๐ฏ Meta แแแแแแแก แแแ แแแ
// Next.js-แจแ SEO แแแแแแแแแขแ
import Head from 'next/head';
const SEO = ({ title, description, image }) => (
<Head>
<title>{title}</title>
<meta name="description" content={description} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={image} />
</Head>
);
2. ๐ Sitemap แแแแแ แแชแแ
// next-sitemap.config.js
module.exports = {
siteUrl: process.env.SITE_URL,
generateRobotsTxt: true,
sitemapSize: 7000,
};
๐ แฌแแ แแแแแแแก แแแขแแแแแแชแแ
1. โก แกแฃแ แแแแแแก แแแขแแแแแแชแแ
// Next.js Image แแแแแแแแแขแ
import Image from 'next/image';
const OptimizedImage = ({ src, alt }) => (
<Image
src={src}
alt={alt}
width={800}
height={600}
layout="responsive"
placeholder="blur"
/>
);
2. ๐ API แแแแฎแแแแแแแก แแแขแแแแแแชแแ
// SWR-แแก แแแแแงแแแแแ แแแแแชแแแแแแก แฅแแจแแ แแแแกแแแแก
import useSWR from 'swr';
const fetcher = url => fetch(url).then(r => r.json());
function Posts() {
const { data, error } = useSWR('/api/posts', fetcher);
if (error) return <div>Failed to load</div>;
if (!data) return <div>Loading...</div>;
return (
<div>
{data.map(post => (
<Post key={post.id} post={post} />
))}
</div>
);
}
๐ฑ แแแแแแฃแ แ แแแขแแแแแแชแแ
1. ๐ฑ Responsive แแแแแแแ
/* Tailwind CSS แแแแกแแแ */
.responsive-container {
@apply container mx-auto px-4 sm:px-6 lg:px-8;
}
.grid-layout {
@apply grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6;
}
2. ๐จ Mobile-First แแแแแแแ
// React แแแแแแแแแขแ แแแแแแฃแ แ แแแขแแแแแแชแแแ
const MobileOptimizedLayout = () => {
const [isMobile, setIsMobile] = useState(false);
useEffect(() => {
const checkMobile = () => {
setIsMobile(window.innerWidth < 768);
};
window.addEventListener('resize', checkMobile);
checkMobile();
return () => window.removeEventListener('resize', checkMobile);
}, []);
return (
<div className={isMobile ? 'mobile-layout' : 'desktop-layout'}>
{/* แแแแขแแแขแ */}
</div>
);
};
Headless WordPress แฌแแ แแแแแแแแก แแแแแแแแ แแแ แแแ-แแแแแแแแแแแขแแก แแซแแแแ แแแแแแแแก, แ แแแแแแช แแแ แแแแแแแก:
- ๐ แแแฃแแฏแแแแกแแแฃแ แฌแแ แแแแแแแก
- ๐ฑ แแแฅแแแ แแแแแแแแแแแขแก
- ๐ แแแซแแแแ แแแฃแ แฃแกแแคแ แแฎแแแแแก
- ๐จ แฃแกแแแฆแแ แ แแแแแแแแก แจแแกแแซแแแแแแแแแก
๐ แกแแญแแ แ แ แแกแฃแ แกแแแ
- ๐ WordPress REST API แแแแฃแแแแขแแชแแ
- ๐ฏ Next.js แกแแฎแแแแซแฆแแแแแแ
- ๐ป React แแแแแแแแแแแขแแก แแแแแแแ
- ๐ง GraphQL แขแฃแขแแ แแแแแแ
๐แจแแฏแแแแแแกแแแก:
Headless WordPress แแ แแก แแแแแแแแ แแแ แแแแแแแ แแแ-แแแแแแแแแแแขแจแ, แ แแแแแแช WordPress-แก แแฎแแแแ แแแแขแแแขแแก แแแ แแแแก แกแแกแขแแแแ (CMS) แแงแแแแแก, แแ แแแกแแแ แแแแกแฎแแแแแแฃแ แคแ แแแข-แแแ แแแแขแคแแ แแแแก แฃแแแ แแขแแกแแแแก แแแแญแแแก. แแก แแ แฅแแขแแฅแขแฃแ แ แฃแแ แฃแแแแแงแแคแก แแแฅแแแแแแแก, แฃแกแแคแ แแฎแแแแแกแ แแ แแแฆแแแ แฌแแ แแแแแแแก แแแแขแคแแ แแแแแก แแแแแแแแ แแแแก.
แขแ แแแแชแแฃแแ WordPress แแ แฅแแขแแฅแขแฃแ แ แแแแแแแแฃแ แแ แแ แแงแแแแแก PHP แแแแแแก, แฎแแแ Headless WordPress แแฃแจแแแแก API-first แแแแแแแแแ, แ แแช แกแแจแฃแแแแแแก แแซแแแแก แแแแแแแแ แแแแก แกแฎแแแแแกแฎแแ front-end แขแแฅแแแแแแแแแแ, แ แแแแ แแชแแ React.js, Vue.js แแ Next.js.
แฃแแแ แแขแแกแแแแแ แแแแชแแแก:
- โก แฌแแ แแแแแแ: แฃแคแ แ แกแฌแ แแคแ แแแขแแแ แแแ แแ แแแแแ แขแแแแแฃแแ แกแแ แแแ แแก แแแขแแแ แแแ.
- ๐ ๏ธ แแแฅแแแแ แแแแแแแแ แแแ: แแแแแแแแ แแแ JavaScript แฉแแ แฉแแแแแก แแแแแงแแแแแ.
- ๐ แฃแกแแคแ แแฎแแแแ: แแแงแแคแแแ แแ แฅแแขแแฅแขแฃแ แ แแแชแแ แแแก แแแฌแงแแแแแแแแแแก แ แแกแแก.
แแแแแแแแแขแแชแแแกแแก, WordPress REST API-แแ แแแงแ แแแแแแ แจแแกแแซแแแแแแแ back-end แแแแแชแแแแแแก แแแแฌแแแแแ แกแฎแแแแแกแฎแแ front-end แแแ แแแแแแแแก. CORS แแ แแแแแชแแแแ แแแจแแ แแแแก แแแ แแแ แแกแแแ แฃแแแแจแแแแแแแแแแกแแ, แ แแ แกแฌแแ แแ แแแฃแจแแแก.
Headless WordPress แฃแแ แฃแแแแแงแแคแก แซแแแแ แ, แแแแแแแแ แแแ แแ แแ แแแแแคแแ แแแแแ แแแแขแคแแ แแแแแก แจแแฅแแแแก แจแแกแแซแแแแแแแแก, แ แแช แแฃแแขแแแแแขแคแแ แแฃแ แแ UX/แชแแคแ แฃแแ แแ แแแฃแฅแขแแแแก แแแแฃแกแขแ แแแจแ แแแแกแแแฃแแ แแแแ แแแแฃแแแ แฃแแแ.