Permission callbacks check if a user can do something before allowing it. This keeps your site safe and controls access.
Permission callbacks in Wordpress
register_rest_route( 'namespace/v1', '/route', array( 'methods' => 'GET', 'callback' => 'your_callback_function', 'permission_callback' => 'your_permission_function', ));
The permission_callback is a function that returns true if the user can access, or false if not.
If you do not set permission_callback, WordPress will block access by default for security.
function check_user_permission() {
return current_user_can('edit_posts');
}
register_rest_route('myplugin/v1', '/data', array(
'methods' => 'GET',
'callback' => 'get_data',
'permission_callback' => 'check_user_permission',
));register_rest_route('myplugin/v1', '/public', array( 'methods' => 'GET', 'callback' => 'public_data', 'permission_callback' => '__return_true', ));
function deny_access() {
return false;
}
register_rest_route('myplugin/v1', '/secret', array(
'methods' => 'GET',
'callback' => 'secret_data',
'permission_callback' => 'deny_access',
));This code creates a REST API endpoint at /wp-json/myplugin/v1/secret-message. Only users who can manage options (usually admins) can get the secret message. Others get a permission error.
<?php
function myplugin_permission_check() {
// Only allow users who can manage options (usually admins)
return current_user_can('manage_options');
}
function myplugin_get_secret_message() {
return 'This is a secret message for admins only.';
}
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/secret-message', array(
'methods' => 'GET',
'callback' => 'myplugin_get_secret_message',
'permission_callback' => 'myplugin_permission_check',
));
});Always use permission callbacks to protect your REST API endpoints.
Use WordPress functions like current_user_can() inside your permission callback to check user roles or capabilities.
If your permission callback returns false, WordPress sends a 403 Forbidden error automatically.
Permission callbacks control who can access REST API routes.
They return true to allow access or false to block it.
Use WordPress capability checks inside permission callbacks for security.
Practice
Solution
Step 1: Understand permission callback role
A permission callback is a function that decides if a user can access a REST API route.Step 2: Identify what permission callback checks
It returns true if the user has the right capability, false otherwise.Final Answer:
To check if the current user has permission to access the route -> Option BQuick Check:
Permission callback = access control [OK]
- Confusing permission callback with route registration
- Thinking it formats data instead of checking access
- Assuming it sets the route URL
register_rest_route?Solution
Step 1: Understand callback syntax in PHP arrays
Callbacks are passed as callable references without parentheses.Step 2: Identify correct syntax for permission_callback
It should be a string or callable without calling it immediately, so no parentheses.Final Answer:
"permission_callback" => check_user_permission -> Option DQuick Check:
Callback = function name without () [OK]
- Adding parentheses calls the function immediately
- Using array() incorrectly for single function
- Passing callback as a string with quotes and parentheses
register_rest_route allow?function my_permission_check() {
return current_user_can('edit_posts');
}
register_rest_route('myplugin/v1', '/data', [
'methods' => 'GET',
'callback' => 'my_data_callback',
'permission_callback' => 'my_permission_check'
]);Solution
Step 1: Analyze the permission callback function
The function returns true if the current user has the 'edit_posts' capability.Step 2: Understand effect on route access
Only users with 'edit_posts' capability can access the route; others get denied.Final Answer:
Only users who can edit posts can access the route -> Option AQuick Check:
Capability check controls access [OK]
- Assuming all users can access without checking capability
- Confusing 'edit_posts' with administrator only
- Ignoring the return value of permission callback
function check_permission() {
if (current_user_can('edit_posts')) {
return true;
}
}Solution
Step 1: Review function return paths
The function returns true if user can edit posts, but returns nothing otherwise.Step 2: Understand permission callback requirements
Permission callbacks must return true or false explicitly to avoid unexpected behavior.Final Answer:
Missing return false when user lacks permission -> Option CQuick Check:
Always return true or false in permission callbacks [OK]
- Omitting return false causes implicit null return
- Assuming no return means false automatically
- Using wrong capability names
edit_posts or publish_posts. Which permission callback function correctly implements this?Solution
Step 1: Understand the requirement
Access should be granted if user can edit posts OR publish posts.Step 2: Analyze each function logic
function permission_check() { return current_user_can('edit_posts') && current_user_can('publish_posts'); } requires both capabilities (AND), which is too strict. function permission_check() { return current_user_can('edit_posts') || current_user_can('publish_posts'); } uses OR, which matches requirement. function permission_check() { if (current_user_can('edit_posts')) { return true; } return false; } only checks edit_posts. function permission_check() { return current_user_can('publish_posts'); } only checks publish_posts.Final Answer:
function permission_check() { return current_user_can('edit_posts') || current_user_can('publish_posts'); } -> Option AQuick Check:
Use OR for either capability allowed [OK]
- Using && instead of || for either/or logic
- Checking only one capability when two are needed
- Not returning false explicitly when needed
Ready to prove it?
Pass the test and this pattern moves unknown
