/* |-------------------------------------------------------------------------- | Create Main WordPress Post Endpoint |-------------------------------------------------------------------------- | | POST: | https://presalemaster.com/wp-json/custom/v8/post | | Supports: | - title | - content | - excerpt | - status | - slug | - author | - categories | - tags | - featured_media | - featured_image_url | - meta | |-------------------------------------------------------------------------- */ add_action('rest_api_init', function () { register_rest_route( 'custom/v8', '/post', array( 'methods' => 'POST', 'callback' => 'custom_create_main_post', 'permission_callback' => function () { /* |-------------------------------------------------------------------------- | User must be logged in |-------------------------------------------------------------------------- */ if (!is_user_logged_in()) { return new WP_Error( 'rest_forbidden', 'You must be logged in to create a post.', array( 'status' => 401 ) ); } /* |-------------------------------------------------------------------------- | User must have permission to create posts |-------------------------------------------------------------------------- */ if (!current_user_can('edit_posts')) { return new WP_Error( 'rest_forbidden', 'You do not have permission to create posts.', array( 'status' => 403 ) ); } return true; }, ) ); }); /* |-------------------------------------------------------------------------- | Create Main WordPress Post |-------------------------------------------------------------------------- */ function custom_create_main_post(WP_REST_Request $request) { /* |-------------------------------------------------------------------------- | GET JSON DATA |-------------------------------------------------------------------------- */ $data = $request->get_json_params(); /* |-------------------------------------------------------------------------- | VALIDATE DATA |-------------------------------------------------------------------------- */ if (empty($data) || !is_array($data)) { return new WP_Error( 'invalid_data', 'Invalid JSON data.', array( 'status' => 400 ) ); } /* |-------------------------------------------------------------------------- | BASIC POST DATA |-------------------------------------------------------------------------- */ $title = isset($data['title']) ? sanitize_text_field($data['title']) : ''; $content = isset($data['content']) ? wp_kses_post($data['content']) : ''; $excerpt = isset($data['excerpt']) ? wp_kses_post($data['excerpt']) : ''; $status = isset($data['status']) ? sanitize_key($data['status']) : 'draft'; $slug = isset($data['slug']) ? sanitize_title($data['slug']) : ''; $author = isset($data['author']) ? intval($data['author']) : 0; /* |-------------------------------------------------------------------------- | VALIDATE TITLE |-------------------------------------------------------------------------- */ if (empty($title)) { return new WP_Error( 'missing_title', 'Post title is required.', array( 'status' => 400 ) ); } /* |-------------------------------------------------------------------------- | ALLOWED STATUS |-------------------------------------------------------------------------- */ $allowed_statuses = array( 'draft', 'publish', 'pending', 'private', 'future' ); if (!in_array($status, $allowed_statuses, true)) { $status = 'draft'; } /* |-------------------------------------------------------------------------- | AUTHOR |-------------------------------------------------------------------------- */ if ($author > 0) { $author_user = get_user_by( 'id', $author ); if (!$author_user) { return new WP_Error( 'invalid_author', 'Author not found.', array( 'status' => 400 ) ); } } else { /* |-------------------------------------------------------------------------- | Use currently logged-in user |-------------------------------------------------------------------------- */ $author = get_current_user_id(); } /* |-------------------------------------------------------------------------- | CREATE POST |-------------------------------------------------------------------------- */ $post_data = array( 'post_type' => 'post', 'post_title' => $title, 'post_content' => $content, 'post_excerpt' => $excerpt, 'post_status' => $status, 'post_author' => $author, ); /* |-------------------------------------------------------------------------- | ADD SLUG |-------------------------------------------------------------------------- */ if (!empty($slug)) { $post_data['post_name'] = $slug; } /* |-------------------------------------------------------------------------- | INSERT POST |-------------------------------------------------------------------------- */ $post_id = wp_insert_post( $post_data, true ); /* |-------------------------------------------------------------------------- | CHECK POST CREATION |-------------------------------------------------------------------------- */ if (is_wp_error($post_id)) { return new WP_Error( 'post_creation_failed', $post_id->get_error_message(), array( 'status' => 500 ) ); } /* |-------------------------------------------------------------------------- | CATEGORIES |-------------------------------------------------------------------------- | | Example: | | "categories": [12, 15] | |-------------------------------------------------------------------------- */ $saved_categories = array(); if ( isset($data['categories']) && is_array($data['categories']) ) { $category_ids = array_map( 'intval', $data['categories'] ); $category_ids = array_filter( $category_ids, function ($id) { return $id > 0; } ); if (!empty($category_ids)) { $category_result = wp_set_post_categories( $post_id, $category_ids, false ); if (is_wp_error($category_result)) { wp_delete_post( $post_id, true ); return new WP_Error( 'category_error', 'Failed to assign categories.', array( 'status' => 400, 'details' => $category_result->get_error_message() ) ); } $saved_categories = $category_ids; } } /* |-------------------------------------------------------------------------- | TAGS |-------------------------------------------------------------------------- | | Example: | | "tags": [25, 31] | |-------------------------------------------------------------------------- */ $saved_tags = array(); if ( isset($data['tags']) && is_array($data['tags']) ) { $tag_ids = array_map( 'intval', $data['tags'] ); $tag_ids = array_filter( $tag_ids, function ($id) { return $id > 0; } ); if (!empty($tag_ids)) { $tag_result = wp_set_post_tags( $post_id, $tag_ids, false ); if (is_wp_error($tag_result)) { wp_delete_post( $post_id, true ); return new WP_Error( 'tag_error', 'Failed to assign tags.', array( 'status' => 400, 'details' => $tag_result->get_error_message() ) ); } $saved_tags = $tag_ids; } } /* |-------------------------------------------------------------------------- | FEATURED MEDIA |-------------------------------------------------------------------------- | | Existing WordPress media ID can be supplied. | | Example: | | "featured_media": 1234 | |-------------------------------------------------------------------------- */ $featured_media_id = 0; if ( isset($data['featured_media']) && intval($data['featured_media']) > 0 ) { $featured_media_id = intval( $data['featured_media'] ); /* |-------------------------------------------------------------------------- | Check attachment |-------------------------------------------------------------------------- */ $attachment = get_post( $featured_media_id ); if ( !$attachment || $attachment->post_type !== 'attachment' ) { $featured_media_id = 0; } } /* |-------------------------------------------------------------------------- | FEATURED IMAGE FROM URL |-------------------------------------------------------------------------- | | This is useful for n8n. | | Example: | | "featured_image_url": | "https://example.com/image.jpg" | |-------------------------------------------------------------------------- */ $featured_image_url = isset($data['featured_image_url']) ? esc_url_raw($data['featured_image_url']) : ''; if ( empty($featured_media_id) && !empty($featured_image_url) ) { /* |-------------------------------------------------------------------------- | Load WordPress media functions |-------------------------------------------------------------------------- */ require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; /* |-------------------------------------------------------------------------- | Download image |-------------------------------------------------------------------------- */ $tmp = download_url( $featured_image_url, 60 ); /* |-------------------------------------------------------------------------- | Check download error |-------------------------------------------------------------------------- */ if (is_wp_error($tmp)) { wp_delete_post( $post_id, true ); return new WP_Error( 'featured_image_download_failed', 'Failed to download featured image.', array( 'status' => 400, 'details' => $tmp->get_error_message() ) ); } /* |-------------------------------------------------------------------------- | Get filename |-------------------------------------------------------------------------- */ $url_path = wp_parse_url( $featured_image_url, PHP_URL_PATH ); $filename = $url_path ? basename($url_path) : 'featured-image.jpg'; /* |-------------------------------------------------------------------------- | Remove query parameters from filename |-------------------------------------------------------------------------- */ $filename = sanitize_file_name( $filename ); /* |-------------------------------------------------------------------------- | Make sure filename has extension |-------------------------------------------------------------------------- */ if (empty(pathinfo($filename, PATHINFO_EXTENSION))) { $filename .= '.jpg'; } /* |-------------------------------------------------------------------------- | Prepare file |-------------------------------------------------------------------------- */ $file_array = array( 'name' => $filename, 'tmp_name' => $tmp, ); /* |-------------------------------------------------------------------------- | Upload image to Media Library |-------------------------------------------------------------------------- */ $attachment_id = media_handle_sideload( $file_array, $post_id, $title ); /* |-------------------------------------------------------------------------- | Check media upload |-------------------------------------------------------------------------- */ if (is_wp_error($attachment_id)) { @unlink($tmp); wp_delete_post( $post_id, true ); return new WP_Error( 'featured_image_upload_failed', 'Failed to upload featured image.', array( 'status' => 400, 'details' => $attachment_id->get_error_message() ) ); } /* |-------------------------------------------------------------------------- | Set featured image |-------------------------------------------------------------------------- */ $featured_media_id = intval( $attachment_id ); } /* |-------------------------------------------------------------------------- | SET FEATURED IMAGE |-------------------------------------------------------------------------- */ if ($featured_media_id > 0) { set_post_thumbnail( $post_id, $featured_media_id ); } /* |-------------------------------------------------------------------------- | CUSTOM META |-------------------------------------------------------------------------- | | Example: | | "meta": { | "developer_name": "ABC Developer", | "project_address": "Toronto, Canada" | } | |-------------------------------------------------------------------------- */ $saved_meta = array(); if ( isset($data['meta']) && is_array($data['meta']) ) { foreach ( $data['meta'] as $meta_key => $meta_value ) { /* |-------------------------------------------------------------------------- | Sanitize meta key |-------------------------------------------------------------------------- */ $meta_key = sanitize_key( $meta_key ); if (empty($meta_key)) { continue; } /* |-------------------------------------------------------------------------- | Convert array/object to JSON |-------------------------------------------------------------------------- */ if ( is_array($meta_value) || is_object($meta_value) ) { $meta_value = wp_json_encode( $meta_value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ); } /* |-------------------------------------------------------------------------- | Save meta |-------------------------------------------------------------------------- */ update_post_meta( $post_id, $meta_key, $meta_value ); /* |-------------------------------------------------------------------------- | Save response data |-------------------------------------------------------------------------- */ $saved_meta[$meta_key] = $meta_value; } } /* |-------------------------------------------------------------------------- | GET POST CATEGORIES |-------------------------------------------------------------------------- */ $category_objects = get_the_category( $post_id ); $category_response = array(); foreach ($category_objects as $category) { $category_response[] = array( 'id' => $category->term_id, 'name' => $category->name, 'slug' => $category->slug, ); } /* |-------------------------------------------------------------------------- | GET POST TAGS |-------------------------------------------------------------------------- */ $tag_objects = get_the_tags( $post_id ); $tag_response = array(); if ($tag_objects && !is_wp_error($tag_objects)) { foreach ($tag_objects as $tag) { $tag_response[] = array( 'id' => $tag->term_id, 'name' => $tag->name, 'slug' => $tag->slug, ); } } /* |-------------------------------------------------------------------------- | FEATURED IMAGE URL |-------------------------------------------------------------------------- */ $featured_image = ''; if ($featured_media_id > 0) { $featured_image = wp_get_attachment_url( $featured_media_id ); } /* |-------------------------------------------------------------------------- | RESPONSE |-------------------------------------------------------------------------- */ return new WP_REST_Response( array( 'success' => true, 'message' => 'Post created successfully.', 'post' => array( /* |-------------------------------------------------------------------------- | Post ID |-------------------------------------------------------------------------- */ 'id' => $post_id, /* |-------------------------------------------------------------------------- | Title |-------------------------------------------------------------------------- */ 'title' => get_the_title( $post_id ), /* |-------------------------------------------------------------------------- | Slug |-------------------------------------------------------------------------- */ 'slug' => get_post_field( 'post_name', $post_id ), /* |-------------------------------------------------------------------------- | Status |-------------------------------------------------------------------------- */ 'status' => get_post_status( $post_id ), /* |-------------------------------------------------------------------------- | Post URL |-------------------------------------------------------------------------- */ 'url' => get_permalink( $post_id ), /* |-------------------------------------------------------------------------- | Author |-------------------------------------------------------------------------- */ 'author' => array( 'id' => intval( get_post_field( 'post_author', $post_id ) ), 'name' => get_the_author_meta( 'display_name', get_post_field( 'post_author', $post_id ) ), ), /* |-------------------------------------------------------------------------- | Categories |-------------------------------------------------------------------------- */ 'categories' => $category_response, /* |-------------------------------------------------------------------------- | Tags |-------------------------------------------------------------------------- */ 'tags' => $tag_response, /* |-------------------------------------------------------------------------- | Featured Media |-------------------------------------------------------------------------- */ 'featured_media' => $featured_media_id, /* |-------------------------------------------------------------------------- | Featured Image URL |-------------------------------------------------------------------------- */ 'featured_image' => $featured_image, /* |-------------------------------------------------------------------------- | Meta |-------------------------------------------------------------------------- */ 'meta' => $saved_meta, ), ), 201 ); } Page not found - presalemaster.com

Oh oh! Page not found.

We're sorry, but the page you are looking for doesn't exist.
You can search your topic using the box below or return to the homepage.

Back to Homepage

Compare listings

Compare