وردپرس‌کالاوردپرس رو ساده‌تر توسعه بده
عضویت VIP

REST API وردپرس: ساخت اندپوینت سفارشی، احراز هویت با Application Password، کش و امنیت

REST API راه استاندارد اتصال اپ موبایل، سایت هدلس، سرویس‌های اتوماسیون و هوش مصنوعی به وردپرس است. در این راهنما یک API واقعی محصولات می‌سازید، چهار روش احراز هویت را مقایسه می‌کنید، کش را در چهار لایه می‌چینید و با چک‌لیست امنیت API را آماده‌ی انتشار می‌کنید.

REST API وردپرس: اندپوینت سفارشی، احراز هویت با Application Password، کش و امنیت

REST API وردپرس راه استاندارد صحبت کردن هر چیز دیگری با سایت شماست: اپ موبایل، فرانت هدلس با Next.js، سرویس‌های اتوماسیون، عامل‌های هوش مصنوعی و حتی خود ویرایشگر بلاکی. هر وردپرسی از نسخه‌ی ۴.۷ آن را دارد و آدرسش /wp-json/ است. این راهنما یک API واقعی برای محصولات می‌سازد: اندپوینت فهرست با فیلتر و صفحه‌بندی، اندپوینت تکی با خطای درست و اندپوینت نوشتنی که به ورود نیاز دارد. بعد احراز هویت را با چهار روش مقایسه می‌کند، کش را در چهار لایه می‌چیند و با چک‌لیست امنیت تمام می‌شود.

آنچه در این آموزش یاد می‌گیرید

  • ساختار REST API وردپرس و کاوش اندپوینت‌های هسته با _fields و _embed
  • ساخت اندپوینت سفارشی با register_rest_route، اعتبارسنجی ورودی و پاسخ و خطای استاندارد
  • احراز هویت: کوکی و nonce برای جاوااسکریپت، Application Password برای اپ و سرویس، و کی سراغ JWT بروید
  • افزودن فیلد به اندپوینت‌های موجود و نمایش متا با register_post_meta
  • کش در چهار لایه: Transient، کش آبجکت، سرآیندهای HTTP و کم کردن حجم پاسخ
  • امنیت: پنهان کردن کاربران، CORS محدود، محدودیت نرخ و اشتباهات رایج

REST API وردپرس چطور کار می‌کند

مسیر یک درخواست در REST API وردپرس: تطبیق مسیر، permission_callback، اعتبارسنجی و پاسخ
پنج مرحله‌ی هر درخواست. callback شما فقط وقتی اجرا می‌شود که مسیر، مجوز و ورودی همگی درست باشند.

هر درخواست به /wp-json/ توسط وردپرس دریافت می‌شود، با مسیرهای ثبت‌شده مقایسه می‌شود، permission_callback آن مسیر اجرا می‌شود، پارامترها بر اساس args اعتبارسنجی و تمیز می‌شوند و در نهایت callback شما پاسخ را می‌سازد. هر مرحله می‌تواند با WP_Error درخواست را متوقف کند و کلاینت کد HTTP مناسب (۴۰۰، ۴۰۱، ۴۰۳ یا ۴۰۴) بگیرد. اندپوینت‌های هسته زیر wp/v2 هستند؛ قبل از ساختن چیزی جدید، آن‌ها را بشناسید:

# فهرست همه‌ی namespace ها و مسیرها
curl -s https://example.ir/wp-json/ | jq '.namespaces'

# ده نوشته‌ی آخر، فقط فیلدهای لازم
curl -s "https://example.ir/wp-json/wp/v2/posts?per_page=10&_fields=id,title,link,date"

# نوشته با تصویر شاخص و نویسنده در همان پاسخ
curl -s "https://example.ir/wp-json/wp/v2/posts/123?_embed"

# سرآیندهای صفحه‌بندی
curl -sI "https://example.ir/wp-json/wp/v2/posts?per_page=20" | grep -i x-wp-total
پارامترکارمثال
_fieldsفقط فیلدهای مشخص؛ حجم پاسخ گاهی ده برابر کمتر می‌شود?_fields=id,title.rendered,link
_embedمنابع مرتبط (نویسنده، تصویر شاخص، دسته‌ها) در همان پاسخ?_embed=author,wp:featuredmedia
per_page و pageصفحه‌بندی؛ حداکثر ۱۰۰ در هر درخواست?per_page=20&page=3
searchجست‌وجوی متنی?search=وردپرس
orderby و orderمرتب‌سازی?orderby=date&order=desc
سرآیند X-WP-Totalتعداد کل نتایج برای ساخت صفحه‌بندیدر پاسخ، نه در آدرس

ساخت اندپوینت سفارشی

آناتومی register_rest_route: namespace، مسیر، متد و callback، permission_callback و args
پنج بخش هر اندپوینت. مجوز و اعتبارسنجی اختیاری نیستند؛ بدون آن‌ها API شما یک در باز است.

کد زیر یک افزونه‌ی کامل است. سه اندپوینت می‌سازد: فهرست محصولات با فیلتر دسته و صفحه‌بندی، یک محصول با شناسه، و افزودن به علاقه‌مندی‌ها که فقط برای کاربر واردشده کار می‌کند. همه‌ی ثبت‌ها روی rest_api_init است تا در درخواست‌های عادی سایت بارگذاری نشود:

<?php
/**
 * Plugin Name: API محصولات وردپرس کالا
 */

defined( 'ABSPATH' ) || exit;

add_action( 'rest_api_init', function () {
	// GET /wp-json/wpkala/v1/products?per_page=10&category=themes
	register_rest_route( 'wpkala/v1', '/products', array(
		'methods'             => WP_REST_Server::READABLE,
		'callback'            => 'wpkala_api_list_products',
		'permission_callback' => '__return_true', // عمومی، آگاهانه
		'args'                => array(
			'per_page' => array(
				'type'              => 'integer',
				'default'           => 10,
				'minimum'           => 1,
				'maximum'           => 50,
				'sanitize_callback' => 'absint',
			),
			'category' => array(
				'type'              => 'string',
				'sanitize_callback' => 'sanitize_title',
				'validate_callback' => function ( $value ) {
					return '' === $value || term_exists( $value, 'product_cat' );
				},
			),
		),
	) );

	// GET /wp-json/wpkala/v1/products/123
	register_rest_route( 'wpkala/v1', '/products/(?P<id>\d+)', array(
		'methods'             => WP_REST_Server::READABLE,
		'callback'            => 'wpkala_api_get_product',
		'permission_callback' => '__return_true',
		'args'                => array(
			'id' => array( 'type' => 'integer', 'sanitize_callback' => 'absint' ),
		),
	) );

	// POST /wp-json/wpkala/v1/products/123/favorite  (نیاز به ورود)
	register_rest_route( 'wpkala/v1', '/products/(?P<id>\d+)/favorite', array(
		'methods'             => WP_REST_Server::CREATABLE,
		'callback'            => 'wpkala_api_favorite',
		'permission_callback' => fn() => is_user_logged_in(),
		'args'                => array(
			'id' => array( 'type' => 'integer', 'sanitize_callback' => 'absint' ),
		),
	) );
} );

function wpkala_product_to_array( WP_Post $post ): array {
	return array(
		'id'    => $post->ID,
		'title' => get_the_title( $post ),
		'price' => (int) get_post_meta( $post->ID, '_price', true ),
		'image' => get_the_post_thumbnail_url( $post, 'medium' ) ?: null,
		'link'  => get_permalink( $post ),
	);
}

function wpkala_api_list_products( WP_REST_Request $request ) {
	$query_args = array(
		'post_type'      => 'product',
		'post_status'    => 'publish',
		'posts_per_page' => $request['per_page'],
		'paged'          => max( 1, (int) $request->get_param( 'page' ) ),
	);
	if ( $request['category'] ) {
		$query_args['tax_query'] = array(
			array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $request['category'] ),
		);
	}

	$query = new WP_Query( $query_args );
	$items = array_map( 'wpkala_product_to_array', $query->posts );

	$response = rest_ensure_response( $items );
	$response->header( 'X-WP-Total', (int) $query->found_posts );
	$response->header( 'X-WP-TotalPages', (int) $query->max_num_pages );
	return $response;
}

function wpkala_api_get_product( WP_REST_Request $request ) {
	$post = get_post( $request['id'] );
	if ( ! $post || 'product' !== $post->post_type || 'publish' !== $post->post_status ) {
		return new WP_Error( 'wpkala_not_found', 'محصول پیدا نشد.', array( 'status' => 404 ) );
	}
	return rest_ensure_response( wpkala_product_to_array( $post ) );
}

function wpkala_api_favorite( WP_REST_Request $request ) {
	$user_id   = get_current_user_id();
	$favorites = (array) get_user_meta( $user_id, 'wpkala_favorites', true );

	if ( in_array( $request['id'], $favorites, true ) ) {
		return new WP_Error( 'wpkala_exists', 'این محصول قبلاً در علاقه‌مندی‌ها بود.', array( 'status' => 409 ) );
	}

	$favorites[] = (int) $request['id'];
	update_user_meta( $user_id, 'wpkala_favorites', $favorites );

	$response = rest_ensure_response( array( 'favorites' => $favorites ) );
	$response->set_status( 201 );
	return $response;
}

چند نکته که این کد را از نمونه‌های اینترنتی جدا می‌کند:

  • args با type و minimum و maximum. وردپرس خودش بر اساس این schema اعتبارسنجی می‌کند؛ per_page بالای ۵۰ قبل از رسیدن به کد شما با ۴۰۰ رد می‌شود.
  • permission_callback صریح. حتی برای اندپوینت عمومی __return_true نوشته شده تا معلوم باشد آگاهانه عمومی است. از وردپرس ۵.۵ نبود این کلید هشدار می‌دهد.
  • WP_Error با status. بدون کلید status هر خطایی ۵۰۰ برمی‌گردد و کلاینت نمی‌فهمد مشکل از او بوده یا سرور.
  • سرآیندهای X-WP-Total. همان قراردادی که هسته استفاده می‌کند تا کلاینت صفحه‌بندی بسازد.
  • rest_ensure_response() آرایه را به WP_REST_Response تبدیل می‌کند تا بتوانید سرآیند و کد وضعیت تنظیم کنید.

برای APIهای بزرگ‌تر، کلاس WP_REST_Controller را extend کنید؛ همان الگویی که اندپوینت‌های هسته دارند و schema، صفحه‌بندی و لینک‌های _links را استاندارد می‌کند. برای سه اندپوینت تابع ساده کافی است.

احراز هویت: چه کسی دارد درخواست می‌دهد؟

مقایسه روش‌های احراز هویت REST API وردپرس: کوکی و nonce، Application Password، JWT و OAuth
چهار روش. دو تای اول در هسته‌اند و برای بیشتر پروژه‌ها کافی‌اند.

کوکی و nonce برای جاوااسکریپت داخل سایت

اگر درخواست از مرورگر کاربری می‌آید که در همان سایت وارد شده، کوکی ورود او کافی است؛ فقط باید یک nonce هم بفرستید تا وردپرس بداند درخواست از سایت خودتان است نه از سایت دیگری (محافظت CSRF). بدون nonce وردپرس درخواست را به عنوان مهمان پردازش می‌کند:

// در PHP: اسکریپت را با nonce و آدرس REST تنظیم کنید
add_action( 'wp_enqueue_scripts', function () {
	wp_enqueue_script( 'wpkala-fav', get_stylesheet_directory_uri() . '/assets/fav.js', array(), '1.0', true );
	wp_localize_script( 'wpkala-fav', 'wpkalaApi', array(
		'root'  => esc_url_raw( rest_url( 'wpkala/v1/' ) ),
		'nonce' => wp_create_nonce( 'wp_rest' ),
	) );
} );
// assets/fav.js : کاربر واردشده، بدون رمز اضافه
async function addFavorite( productId ) {
	const res = await fetch( `${ wpkalaApi.root }products/${ productId }/favorite`, {
		method: 'POST',
		headers: { 'X-WP-Nonce': wpkalaApi.nonce, 'Content-Type': 'application/json' },
		credentials: 'same-origin',
	} );
	const data = await res.json();
	if ( ! res.ok ) {
		throw new Error( data.message || 'خطای ناشناخته' );
	}
	return data.favorites;
}

در ادیتور بلاکی و هر جایی که بسته‌های وردپرس در دسترس‌اند، @wordpress/api-fetch همین کار را خودکار انجام می‌دهد:

// در ادیتور یا هر جایی که @wordpress/api-fetch در دسترس است
import apiFetch from '@wordpress/api-fetch';

const products = await apiFetch( { path: '/wpkala/v1/products?per_page=5' } );
await apiFetch( { path: '/wpkala/v1/products/123/favorite', method: 'POST' } );
// nonce و آدرس پایه را خود وردپرس تزریق می‌کند

Application Password برای اپ، اسکریپت و سرویس

برای هر چیزی خارج از مرورگر همان سایت، وردپرس از نسخه‌ی ۵.۶ رمز اپلیکیشن دارد: یک رمز جداگانه برای هر اپ یا سرویس که با Basic Auth فرستاده می‌شود، فقط روی HTTPS کار می‌کند و هر کدام جداگانه قابل باطل شدن است. قاعده‌ی مهم: برای هر سرویس یک کاربر جداگانه با کمترین نقش لازم بسازید، هرگز رمز اپ برای حساب مدیر نسازید:

# ساخت کاربر مخصوص سرویس با کمترین نقش و یک Application Password
wp user create api-mobile api@example.ir --role=subscriber
wp user application-password create api-mobile "اپ موبایل" --porcelain
# خروجی مثل: AbCd EfGh IjKl MnOp QrSt UvWx

# فراخوانی با Basic Auth (نام کاربری و رمز اپ، فاصله‌ها مهم نیست)
curl -u "api-mobile:AbCd EfGh IjKl MnOp QrSt UvWx" \
  -X POST https://example.ir/wp-json/wpkala/v1/products/123/favorite

# دیدن و باطل کردن رمزها
wp user application-password list api-mobile
wp user application-password delete api-mobile --all

همین روش برای اتصال ابزارهای اتوماسیون مثل n8n، سرویس‌های هوش مصنوعی و MCP Adapter که در مقاله‌ی اتصال وردپرس به هوش مصنوعی توضیح دادیم استفاده می‌شود. اگر هاست شما سرآیند Authorization را حذف می‌کند (در بعضی تنظیمات آپاچی با FastCGI)، این خط را به .htaccess اضافه کنید: SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1.

JWT و OAuth: کی لازم می‌شوند

وقتی اپ شما کاربر نهایی دارد که با نام کاربری و رمز خودش وارد می‌شود (مثل اپ فروشگاه با ثبت‌نام مشتری)، به توکنی با انقضا نیاز دارید که بعد از ورود صادر شود. این JWT است و در هسته نیست؛ افزونه‌هایی برای آن وجود دارد که با کلید مخفی در wp-config کار می‌کنند. OAuth 2 برای وقتی است که سرویس‌های دیگر باید با اجازه‌ی کاربر به سایت شما وصل شوند؛ برای پلتفرم‌ها معنی دارد و برای یک فروشگاه معمولاً زیادی است.

افزودن فیلد به اندپوینت‌های موجود

لازم نیست برای هر داده اندپوینت جدید بسازید. با register_rest_field فیلد محاسبه‌شده به پاسخ نوشته‌ها اضافه می‌کنید و با register_post_meta و show_in_rest متای سفارشی را هم برای خواندن و هم نوشتن باز می‌کنید؛ همین کار باعث می‌شود ویرایشگر بلاکی هم آن متا را ببیند:

// افزودن فیلد به اندپوینت‌های موجود هسته: GET /wp/v2/posts حالا reading_time دارد
add_action( 'rest_api_init', function () {
	register_rest_field( 'post', 'reading_time', array(
		'get_callback' => function ( $post ) {
			$words = str_word_count( wp_strip_all_tags( get_post_field( 'post_content', $post['id'] ) ) );
			return max( 1, (int) ceil( $words / 200 ) );
		},
		'schema'       => array( 'type' => 'integer', 'description' => 'زمان مطالعه به دقیقه', 'readonly' => true ),
	) );
} );

// نمایش و ویرایش متا از طریق REST (برای ادیتور بلاکی و اپ)
add_action( 'init', function () {
	register_post_meta( 'post', 'wpkala_subtitle', array(
		'type'          => 'string',
		'single'        => true,
		'show_in_rest'  => true,
		'sanitize_callback' => 'sanitize_text_field',
		'auth_callback' => fn() => current_user_can( 'edit_posts' ),
	) );
} );

کش: چهار لایه برای API سریع

چهار لایه کش برای REST API وردپرس: CDN، کش آبجکت، Transient و کم کردن حجم پاسخ
از بیرون به داخل. پاسخ‌های وابسته به کاربر فقط در لایه‌های داخلی با کلید شامل شناسه‌ی کاربر کش می‌شوند.

REST API وردپرس به طور پیش‌فرض کش نمی‌شود و هر درخواست کل وردپرس را بارگذاری می‌کند. برای اپی که هر ثانیه ده‌ها درخواست می‌زند این یعنی سرور زیر بار. ساده‌ترین لایه Transient است که در جدول options می‌ماند و اگر کش آبجکت (Redis) فعال باشد خودکار به آن منتقل می‌شود:

function wpkala_api_list_products( WP_REST_Request $request ) {
	$key    = 'wpkala_products_' . md5( wp_json_encode( $request->get_params() ) );
	$cached = get_transient( $key );
	if ( false !== $cached ) {
		return rest_ensure_response( $cached );
	}

	// ... همان کوئری قبلی ...
	$items = array_map( 'wpkala_product_to_array', $query->posts );

	set_transient( $key, $items, 5 * MINUTE_IN_SECONDS );
	return rest_ensure_response( $items );
}

// پاک کردن کش وقتی محصولی تغییر کرد
add_action( 'save_post_product', function () {
	global $wpdb;
	$wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_wpkala_products_%' OR option_name LIKE '_transient_timeout_wpkala_products_%'" );
} );

برای پاسخ‌های عمومی یک لایه بیرون‌تر هم بروید و به CDN یا nginx بگویید پاسخ را نگه دارد. دقت کنید این سرآیند فقط برای کاربر مهمان و متد GET فرستاده شود:

// سرآیند کش فقط برای پاسخ‌های عمومی namespace خودتان
add_filter( 'rest_post_dispatch', function ( $response, $server, $request ) {
	if ( str_starts_with( $request->get_route(), '/wpkala/v1/products' ) && 'GET' === $request->get_method() && ! is_user_logged_in() ) {
		$response->header( 'Cache-Control', 'public, max-age=300, stale-while-revalidate=60' );
	}
	return $response;
}, 10, 3 );
  • پارامتر _fields را در مستندات API خودتان توصیه کنید؛ کلاینت‌ها فقط آنچه لازم دارند می‌گیرند.
  • در فهرست‌ها هرگز محتوای کامل نوشته را برنگردانید؛ خلاصه کافی است و جزئیات در اندپوینت تکی.
  • کلید کش را از همه‌ی پارامترها بسازید وگرنه کاربر دسته‌ی قالب‌ها نتیجه‌ی دسته‌ی افزونه‌ها را می‌بیند.
  • با افزونه‌ی Query Monitor تعداد کوئری هر درخواست REST را ببینید؛ عدد بالای ۳۰ یعنی جای کش یا بازنویسی کوئری.

امنیت REST API

چک‌لیست امنیت REST API وردپرس پیش از انتشار
شش مورد که پیش از انتشار هر API باید تیک بخورند.

اشتباه رایج این است که به خاطر امنیت کل REST API را غیرفعال کنند؛ ویرایشگر بلاکی، ووکامرس و بیشتر افزونه‌ها از کار می‌افتند. به جای آن نقاط حساس را ببندید:

// فهرست کاربران فقط برای واردشده‌ها
add_filter( 'rest_endpoints', function ( $endpoints ) {
	if ( ! is_user_logged_in() ) {
		unset( $endpoints['/wp/v2/users'], $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
	}
	return $endpoints;
} );

// 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 ) {
		$allowed = array( 'https://app.example.ir', 'http://localhost:3000' );
		$origin  = get_http_origin();
		if ( $origin && in_array( $origin, $allowed, true ) ) {
			header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $origin ) );
			header( 'Access-Control-Allow-Methods: GET, POST, OPTIONS' );
			header( 'Access-Control-Allow-Headers: Authorization, Content-Type, X-WP-Nonce' );
			header( 'Access-Control-Allow-Credentials: true' );
			header( 'Vary: Origin' );
		}
		return $value;
	} );
} );
# nginx: محدودیت نرخ برای مسیر REST (در بلاک http و server)
limit_req_zone $binary_remote_addr zone=wpapi:10m rate=10r/s;

location ~ ^/wp-json/ {
    limit_req zone=wpapi burst=20 nodelay;
    try_files $uri $uri/ /index.php?$args;
}
  • اندپوینت wp/v2/users نام‌های کاربری را به مهمان نشان می‌دهد و اولین قدم حمله‌ی brute force است؛ کد بالا آن را فقط برای واردشده‌ها باز می‌گذارد.
  • CORS را به دامنه‌های مشخص محدود کنید. سرآیند Access-Control-Allow-Origin: * همراه با کوکی یعنی هر سایتی می‌تواند به نام کاربر شما درخواست بزند.
  • محدودیت نرخ را در وب‌سرور بگذارید نه در PHP؛ وقتی درخواست به PHP برسد هزینه‌اش پرداخت شده.
  • هر ورودی را با sanitize تمیز و با validate رد کنید، حتی اگر فقط اپ خودتان درخواست می‌زند؛ هر کسی می‌تواند درخواست اپ شما را تکرار کند.
  • در پاسخ خطا جزئیات داخلی (نام جدول، مسیر فایل، پیام SQL) برنگردانید.
  • لاگ درخواست‌های ناموفق ۴۰۱ و ۴۰۳ را نگه دارید؛ الگوی حمله قبل از موفقیتش دیده می‌شود.

REST API یا Abilities API؟

وردپرس ۶.۹ لایه‌ی جدیدی به نام Abilities API اضافه کرد که قابلیت‌های سایت را با schema و مجوز برای ابزارها و عامل‌های هوش مصنوعی توصیف می‌کند و خودش یک REST هم زیر wp-abilities/v1 دارد. این جایگزین REST API نیست: REST همچنان راه اصلی اپ‌ها و فرانت هدلس است. اگر قابلیتی می‌سازید که قرار است Claude یا Cursor از طریق MCP صدا بزند، آن را به عنوان Ability ثبت کنید؛ اگر اپ موبایل یا سایت Next.js دارید، REST بسازید. هر دو می‌توانند از همان توابع PHP داخلی استفاده کنند.

خطاهای رایج و راه‌حل

نشانهعلتراه‌حل
rest_no_routeمسیر ثبت نشده یا پیوندهای یکتا روی «ساده» استثبت را روی rest_api_init بگذارید و پیوند یکتا را Post name کنید
rest_cookie_invalid_noncenonce نیامده یا منقضی شدهسرآیند X-WP-Nonce با wp_create_nonce( "wp_rest" )؛ nonce هر ۱۲ ساعت عوض می‌شود
401 با Application Passwordسرآیند Authorization حذف می‌شود یا HTTP استHTTPS اجباری؛ خط SetEnvIf در .htaccess
403 rest_forbidden برای کاربر واردشدهpermission_callback نقش کافی نمی‌بیندبا current_user_can و capability درست بررسی کنید نه با نقش
همه‌ی خطاها ۵۰۰ هستندWP_Error بدون کلید statusآرایه‌ی سوم با status بدهید
پاسخ کند استبدون کش و با کوئری سنگین یا _embed بی‌موردTransient، _fields و Query Monitor
CORS error در مرورگرOrigin اپ در فهرست مجاز نیست یا preflight رد می‌شودOPTIONS را مجاز کنید و Origin دقیق را برگردانید
متا در REST دیده نمی‌شودshow_in_rest ندارد یا نوع نوشته custom-fields را پشتیبانی نمی‌کندregister_post_meta با show_in_rest و supports custom-fields در پست‌تایپ

جمع‌بندی

یک API خوب در وردپرس چهار ویژگی دارد: مسیرهای نسخه‌دار زیر namespace خودتان، اعتبارسنجی و مجوز روی هر مسیر، خطاهای با کد HTTP درست و کشی که سرور را زنده نگه دارد. با همین افزونه‌ی سه‌اندپوینتی مقاله می‌توانید اپ موبایل یا فرانت هدلس را شروع کنید و با Application Password بدون هیچ افزونه‌ای به سرویس‌ها وصل شوید.

سه کار برای ادامه: فهرست کاربران را از مهمان پنهان کنید (یک فیلتر، همین امروز)، در API خودتان _fields و صفحه‌بندی را از اول پشتیبانی کنید، و اگر قرار است هوش مصنوعی هم با سایت کار کند مقاله‌ی اتصال وردپرس به هوش مصنوعی و Abilities API را بخوانید. مقاله‌ی وردپرس هدلس با Next.js که همین API را مصرف می‌کند، بعدی در سری وردپرس کالاست.

سؤال‌های متداول

REST API وردپرس را چطور فعال کنم؟

نیازی به فعال کردن نیست؛ از وردپرس ۴.۷ همیشه روشن است و در آدرس /wp-json/ در دسترس است. اگر خطای rest_no_route می‌گیرید معمولاً پیوندهای یکتا روی حالت «ساده» است یا افزونه‌ای آن را بسته؛ در این حالت آدرس ?rest_route=/wp/v2/posts هم کار می‌کند.

Application Password چیست و چه فرقی با رمز اصلی دارد؟

رمزی جداگانه برای هر اپ یا سرویس که با Basic Auth فرستاده می‌شود. با آن نمی‌توان وارد پیشخوان شد، فقط برای REST و XML-RPC کار می‌کند، فقط روی HTTPS پذیرفته می‌شود و هر کدام را می‌توان جداگانه باطل کرد. از وردپرس ۵.۶ در هسته است و با WP-CLI در یک خط ساخته می‌شود.

برای اپ موبایل JWT لازم دارم یا Application Password کافی است؟

اگر اپ با یک حساب سرویس کار می‌کند (مثلاً فقط محتوا می‌خواند یا به نام سایت می‌نویسد) Application Password کافی و امن‌تر است. اگر هر کاربر اپ با حساب خودش وارد می‌شود و باید توکنی با انقضا داشته باشد، به JWT با افزونه نیاز دارید.

چطور REST API را امن کنم بدون اینکه غیرفعالش کنم؟

فهرست کاربران را برای مهمان ببندید، CORS را به دامنه‌های خودتان محدود کنید، در وب‌سرور محدودیت نرخ بگذارید، برای هر مسیر permission_callback و برای هر پارامتر validate و sanitize بنویسید و Application Password را فقط روی HTTPS با کاربر کم‌دسترسی استفاده کنید. غیرفعال کردن کامل، ویرایشگر و ووکامرس را می‌شکند.

چطور پاسخ‌های REST را کش کنم؟

نتیجه‌ی کوئری را با Transient یا کش آبجکت با کلیدی از همه‌ی پارامترها ذخیره کنید و هنگام تغییر محتوا پاکش کنید. برای پاسخ‌های عمومی سرآیند Cache-Control بفرستید تا CDN یا nginx نگهشان دارد. پاسخ‌های وابسته به کاربر را فقط با کلید شامل شناسه‌ی کاربر و هرگز در CDN کش نکنید.

فرق register_rest_route با register_rest_field چیست؟

register_rest_route یک مسیر کاملاً جدید با callback خودتان می‌سازد. register_rest_field به پاسخ اندپوینت‌های موجود (مثل نوشته‌ها) یک فیلد اضافه می‌کند بدون ساختن مسیر جدید. وقتی داده به یک منبع موجود تعلق دارد، دومی ساده‌تر و سازگارتر است.

Abilities API جای REST API را می‌گیرد؟

خیر. Abilities API (از وردپرس ۶.۹) قابلیت‌های سایت را برای ابزارها و عامل‌های هوش مصنوعی با schema و مجوز توصیف می‌کند و خودش روی REST سوار است. REST API همچنان راه اصلی اپ‌ها، سایت هدلس و اتصال سرویس‌هاست. برای عامل هوش مصنوعی Ability بسازید، برای اپ و فرانت REST.

  • ۱۲ دقیقه مطالعه
نویسندهمدیریت

نظرات کاربران

ثبت نظر و امتیاز

هنوز نظری ثبت نشده؛ اولین نظر را شما بنویسید.

نظر و امتیاز خود را بنویسید

ایمیل شما منتشر نمی‌شود. نظرها پس از بازبینی منتشر می‌شوند.

با ارسال نظر، قوانین انتشار نظرات سایت را می‌پذیرید.

مطالب مرتبط

اگر این مقاله برایتان مفید بود، این‌ها را هم بخوانید

محیط توسعه لوکال وردپرس در ۱۴۰۵ با wp-env، Docker، Playground، Studio و LocalWP
توسعه و کدنویسی وردپرس

محیط توسعه‌ی لوکال وردپرس در ۱۴۰۵: wp-env، Docker، Playground، Studio و LocalWP

جایگزین‌های امروزی XAMPP برای توسعه‌ی وردپرس: wp-env ابزار رسمی، Docker Compose برای تیم، Playground برای اجرا داخل مرورگر و Studio و LocalWP برای طراحان. با فایل‌های پیکربندی آماده، Blueprint برای دمو و نکته‌های مخصوص اینترنت ایران.

۹ دقیقه مطالعه
هوک‌های وردپرس به زبان ساده: اکشن، فیلتر و ۲۰ مثال واقعی بدون افزونه
توسعه و کدنویسی وردپرس

هوک‌های وردپرس به زبان ساده: اکشن، فیلتر و ۲۰ مثال واقعی بدون افزونه

هوک‌ها راه رسمی تغییر رفتار وردپرس بدون دست زدن به هسته و افزونه‌ها هستند. در این راهنما اکشن و فیلتر را با تصویر یاد می‌گیرید، چهار پارامتر add_action را باز می‌کنیم، جای درست کد و ترتیب اجرای هوک‌ها را می‌بینید و ۲۰ مثال آماده‌ی کپی برای محتوا، امنیت، ورود، پیشخوان، ووکامرس و کرون می‌گیرید.

۱۳ دقیقه مطالعه
دیپلوی وردپرس با Git و GitHub Actions روی هاست ایرانی
توسعه و کدنویسی وردپرس

دیپلوی وردپرس با Git و GitHub Actions روی هاست ایرانی (راهنمای کامل)

هر تغییر کد با یک git push به صورت خودکار، تست‌شده و قابل بازگشت روی سرور بنشیند. در این راهنما یک پایپ‌لاین کامل GitHub Actions برای وردپرس می‌سازید: ساختار ریپو، کلید دیپلوی، بیلد قالب و بلاک، rsync، WP-CLI، استقرار اتمیک، staging با تأیید انسانی و سه استراتژی مخصوص هاست‌های ایرانی.

۱۲ دقیقه مطالعه
آموزش WP-CLI: ۳۰ دستور کاربردی برای مدیریت، مهاجرت و عیب‌یابی وردپرس
توسعه و کدنویسی وردپرس

آموزش WP-CLI: ۳۰ دستور کاربردی برای مدیریت، مهاجرت و عیب‌یابی وردپرس

WP-CLI رابط خط فرمان رسمی وردپرس است. در این راهنما ۳۰ دستوری را که در کار روزمره بیشترین استفاده را دارند با مثال واقعی یاد می‌گیرید: از نصب و به‌روزرسانی تا پشتیبان دیتابیس، تغییر دامنه، مهاجرت کامل سایت، عیب‌یابی بدون پیشخوان و دستورهای جدید نسخه‌ی ۳ برای وردپرس ۷.