I'm a new with php and I am working on a WordPress project where I need to create a custom REST API endpoint that allows publishing posts with specific permalinks. Here's what I'm trying to achieve:
- Create a new REST API endpoint, something like
/wp-json/custom/post
- This endpoint should accept POST requests with the following parameters:
title
: The title of the postcontent
: The content of the postcustom_permalink
: The specific permalink I want to use for this post
- The endpoint should create a new post with the provided title and content, and set its permalink to the specified custom permalink
- It should return a success message with the post ID if the creation is successful, or an error message if it fails
The main reason I need this custom solution is that the standard slug
parameter in the WordPress REST API doesn't support forward slashes (/
) and automatically converts them to hyphens (-
). For example:
- If I set
slug
tondd/test/test2
, WordPress converts it tondd/test-test2
- What I actually want is to keep the structure as
ndd/test/test2
I don't understand why this isn't possible natively in WordPress for posts, which is why I'm seeking a custom solution.
I've tried using the register_rest_route()
function to create the endpoint, but I'm not sure how to properly set up the rewrite rules to allow for these custom permalinks.
Here's a basic structure I've started with:
add_action('rest_api_init', function () { register_rest_route('custom/v1', '/post', array('methods' => 'POST','callback' => 'create_custom_post_callback','permission_callback' => function() { return current_user_can('publish_posts'); } ));});function create_custom_post_callback($request) { $title = $request->get_param('title'); $content = $request->get_param('content'); $custom_permalink = $request->get_param('custom_permalink'); // Create post $post_id = wp_insert_post(array('post_title' => $title,'post_content' => $content,'post_status' => 'publish', )); if (is_wp_error($post_id)) { return new WP_Error('failed-to-create', 'Failed to create post', array('status' => 500)); } // How do I set the custom permalink here? // What rewrite rules do I need to modify? return new WP_REST_Response(array('post_id' => $post_id), 200);}
My main questions are:
- What rewrite rules do I need to modify to allow for these custom permalinks with multiple levels (e.g.,
ndd/test/test2
)? - How can I set the custom permalink for the newly created post within the callback function, preserving the desired structure?
- Are there any security considerations I should keep in mind when implementing this, especially considering the ability to create arbitrary URL structures?
- Is there a way to achieve this using WordPress's native functionality that I might be overlooking?
Thank you in advance for your help!