Skip to content

Instantly share code, notes, and snippets.

@ivandoric
Last active September 3, 2023 00:16
Show Gist options
  • Save ivandoric/089443880872f1b81ae74f2502e41a1c to your computer and use it in GitHub Desktop.
Save ivandoric/089443880872f1b81ae74f2502e41a1c to your computer and use it in GitHub Desktop.
WordPress Rest API Custom Endpoints Video Tutorials Notes - Check out the videos: https://www.youtube.com/watch?v=C2twS9ArdCI and https://www.youtube.com/watch?v=76sJL9fd12Y
<?php
/**
* Plugin Name: Custom API
* Plugin URI: http://chrushingit.com
* Description: Crushing it!
* Version: 1.0
* Author: Art Vandelay
* Author URI: http://watch-learn.com
*/
function wl_posts() {
$args = [
'numberposts' => 99999,
'post_type' => 'post'
];
$posts = get_posts($args);
$data = [];
$i = 0;
foreach($posts as $post) {
$data[$i]['id'] = $post->ID;
$data[$i]['title'] = $post->post_title;
$data[$i]['content'] = $post->post_content;
$data[$i]['slug'] = $post->post_name;
$data[$i]['featured_image']['thumbnail'] = get_the_post_thumbnail_url($post->ID, 'thumbnail');
$data[$i]['featured_image']['medium'] = get_the_post_thumbnail_url($post->ID, 'medium');
$data[$i]['featured_image']['large'] = get_the_post_thumbnail_url($post->ID, 'large');
$i++;
}
return $data;
}
function wl_post( $slug ) {
$args = [
'name' => $slug['slug'],
'post_type' => 'post'
];
$post = get_posts($args);
$data['id'] = $post[0]->ID;
$data['title'] = $post[0]->post_title;
$data['content'] = $post[0]->post_content;
$data['slug'] = $post[0]->post_name;
$data['featured_image']['thumbnail'] = get_the_post_thumbnail_url($post[0]->ID, 'thumbnail');
$data['featured_image']['medium'] = get_the_post_thumbnail_url($post[0]->ID, 'medium');
$data['featured_image']['large'] = get_the_post_thumbnail_url($post[0]->ID, 'large');
return $data;
}
// Used in this video https://www.youtube.com/watch?v=76sJL9fd12Y
function wl_products() {
$args = [
'numberposts' => 99999,
'post_type' => 'products'
];
$posts = get_posts($args);
$data = [];
$i = 0;
foreach($posts as $post) {
$data[$i]['id'] = $post->ID;
$data[$i]['title'] = $post->post_title;
$data[$i]['slug'] = $post->post_name;
$data[$i]['price'] = get_field('price', $post->ID);
$data[$i]['delivery'] = get_field('delivery', $post->ID);
$i++;
}
return $data;
}
add_action('rest_api_init', function() {
register_rest_route('wl/v1', 'posts', [
'methods' => 'GET',
'callback' => 'wl_posts',
]);
register_rest_route( 'wl/v1', 'posts/(?P<slug>[a-zA-Z0-9-]+)', array(
'methods' => 'GET',
'callback' => 'wl_post',
) );
// Used in this video: https://www.youtube.com/watch?v=76sJL9fd12Y
register_rest_route('wl/v1', 'products', [
'methods' => 'GET',
'callback' => 'wl_products',
]);
});
@kingkarki
Copy link

Thank you for the simple example. Can you post your youtube video link on the comment, please?

@ivandoric
Copy link
Author

@yhatzis
Copy link

yhatzis commented May 16, 2020

Thank you for your code.
It solve many problems.
I'm looking how display categories in posts.
I'm trying adding this but it didn't work "$data[$i]['categories'] = $post->post_categories;"
I suppose because categories is an array...(?)
Also could you propose me how remove some tags (like ' ) from content?
Thank you in advance.

@jassim9797
Copy link

I can not find the Custom API plugin in wordpress plugins, from where i can download it?

@ivandoric
Copy link
Author

@jassim9797

Did you watch the video? There is no Custom API plugin. You create it yourself.

@banna360
Copy link

When i call a ACF field in this its show result as "url": null
$data[$i]['url'] = get_field( "url", $post->ID );

@ivandoric
Copy link
Author

@banna360 Are you sure it should just be url? Check the API response. Maybe it's something like $data[$i]['acf_fields']['url'] or something like that. I think ACF would wrap it's fields inside another array. Not 100% sure, but you can test it out.

@hamzu06
Copy link

hamzu06 commented Sep 11, 2020

Thank you for this code,
I want to send push notification to the mobile app when I publish (Custom post type) POST in WordPress,
I have Java spring Rest API that sends a notification, I want to integrate it with the custom post, How can I do this can you guide me?

Thank you

Custom Post Plugin Code

`<?php
/*
Plugin Name: Send Notification CPT
Description: Declares a plugin that will create a custom post type to send notifications.
Version: 1.0
*/

if( ! defined('ABSPATH')) {
exit;
}

// Register Custom Post Type Send Notifiction
function create_sendnotifiction_cpt() {

$labels = array(
	'name' => _x( 'Send Notifiction', 'Post Type General Name', 'textdomain' ),
	'singular_name' => _x( 'Send Notifiction', 'Post Type Singular Name', 'textdomain' ),
	'menu_name' => _x( 'Send Notifiction', 'Admin Menu text', 'textdomain' ),
	'name_admin_bar' => _x( 'Send Notifiction', 'Add New on Toolbar', 'textdomain' ),
	'archives' => __( 'Send Notifiction Archives', 'textdomain' ),
	'attributes' => __( 'Send Notifiction Attributes', 'textdomain' ),
	'parent_item_colon' => __( 'Parent Send Notifiction:', 'textdomain' ),
	'all_items' => __( 'All Send Notifiction', 'textdomain' ),
	'add_new_item' => __( 'Add New Send Notifiction', 'textdomain' ),
	'add_new' => __( 'Add New', 'textdomain' ),
	'new_item' => __( 'New Send Notifiction', 'textdomain' ),
	'edit_item' => __( 'Edit Send Notifiction', 'textdomain' ),
	'update_item' => __( 'Update Send Notifiction', 'textdomain' ),
	'view_item' => __( 'View Send Notifiction', 'textdomain' ),
	'view_items' => __( 'View Send Notifiction', 'textdomain' ),
	'search_items' => __( 'Search Send Notifiction', 'textdomain' ),
	'not_found' => __( 'Not found', 'textdomain' ),
	'not_found_in_trash' => __( 'Not found in Trash', 'textdomain' ),
	'featured_image' => __( 'Featured Image', 'textdomain' ),
	'set_featured_image' => __( 'Set featured image', 'textdomain' ),
	'remove_featured_image' => __( 'Remove featured image', 'textdomain' ),
	'use_featured_image' => __( 'Use as featured image', 'textdomain' ),
	'insert_into_item' => __( 'Insert into Send Notifiction', 'textdomain' ),
	'uploaded_to_this_item' => __( 'Uploaded to this Send Notifiction', 'textdomain' ),
	'items_list' => __( 'Send Notifiction list', 'textdomain' ),
	'items_list_navigation' => __( 'Send Notifiction list navigation', 'textdomain' ),
	'filter_items_list' => __( 'Filter Send Notifiction list', 'textdomain' ),
);
$args = array(
	'label' => __( 'Send Notifiction', 'textdomain' ),
	'description' => __( '', 'textdomain' ),
	'labels' => $labels,
	'menu_icon' => 'dashicons-format-chat',
	'supports' => array('title', 'editor', 'excerpt', 'thumbnail', 'revisions', 'author', 'comments', 'trackbacks', 'page-attributes', 'post-formats', 'custom-fields'),
	'taxonomies' => array(),
	'public' => true,
	'show_ui' => true,
	'show_in_menu' => true,
	'menu_position' => 5,
	'show_in_admin_bar' => true,
	'show_in_nav_menus' => true,
	'can_export' => true,
	'has_archive' => true,
	'hierarchical' => false,
	'exclude_from_search' => false,
	'show_in_rest' => true,
	'publicly_queryable' => true,
	'capability_type' => 'post',
);
register_post_type( 'sendnotifiction', $args );

}
add_action( 'init', 'create_sendnotifiction_cpt', 0 );

///

function my_plugin_rest_route_for_term( $route, $term ) {
if ( $term->taxonomy === 'genre' ) {
$route = 'http://192.168.100.24:8181/notification/topic' . $term->term_id;
}

return $route;

}
add_filter( 'rest_route_for_term', 'my_plugin_rest_route_for_term', 10, 2 );

//

function rewrite_tuts_flush(){

create_vehicle_details();
flush_rewrite_rules();

}

?>`

@ivandoric
Copy link
Author

@hamzu06 I have no idea man, sorry.

@hamzu06
Copy link

hamzu06 commented Sep 14, 2020

Thank You @ivandoric, my issue is resolved.

@theahmedoff
Copy link

Thank You @ivandoric

@ivandoric
Copy link
Author

@theahmedoff No problem! :)

@harpreetin
Copy link

custom post type shows field values on all posts url but shows null values on single post url.

@RobertCrx
Copy link

Hey I wanna thank you for this snippet. It really helped me man.
I would want to ask you if there is a way to have an offset or a pagination inside the rest-api ? I want to add another filter like "?page=1,2,3" etc
Thank you.

@sharpnife
Copy link

Hi,
I tried the way you coded the endpoint, but for some reason my endpoint is not working.
When I go to the endpoints I'm directed towards the homepage of the site.
Can you help? Thanks in advance

Pastebin: https://pastebin.com/LeeEnMvb

@ivandoric
Copy link
Author

@Esiarp Maybe you need to change the permalinks in WP admin. To use something like /postname/ instead of /?p=123

@sharpnife
Copy link

@ivandoric That was exactly the issue! I changed it to "Day and name" and works perfectly. Thank you!

@08yasins
Copy link

@ivandoric First of all thank you to share this content for us. But, I have some problems at this code. I don't know where can I find the endpoints for the wordpress article. For example I want to get post category but I don't know the endpoint for category like get_the_post_thumbnail_url. Please help us.
Thank you for code again

@angelchickenwings
Copy link

does simply running the code add it as a plug in? that is the part I cannot figure out still lol

@AliNaraghiA
Copy link

can i use ?slug= or /id like>> http://site/wp-json/wp/v2/posts/id or ?slug= with this plugin ? No . and why i cant:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment