LearnDash WordPress plugin has an excellent REST API but version 2 is still in beta so there are some missed routes and endpoints one of them is certificate routes which means until now you can’t download a certificate through your mobile app without writing a custom code handle serving user certificates list and files from the server, so I wrote this snippet which creates a custom REST API routes for LearnDash user certificates for one of my client’s project and I like to share it with you.

Register Certificates REST Route

First, we need to create a route to get a list of user certificates through the URL:

http://yoursite.com/wp-json/yourproject/v1/certificates

by using the WordPress function register_rest_route and other learndash functions.

add_action( 'rest_api_init', function () {
  register_rest_route( 'yourproject/v1', '/certificates', array(
    'methods' => 'GET',
    'callback' => 'yourproject_rest_certificates',
    'permission_callback' => '__return_true'
  ) );
} );

function yourproject_rest_certificates(WP_REST_Request $request ){
    /* GET Certificates For Courses*/
    $post_args = array(
        'post_type'      => 'sfwd-courses',
        'posts_per_page' => - 1,
        'post_status'    => 'publish'
    );

    
    $courses         = get_posts( $post_args );
    $show_cert_title = true;
    $certificate_list = [];

    foreach ( $courses as $course ) {
        $certificate_id     = learndash_get_setting( $course->ID, 'certificate' );
        $certificate_object = get_post( $certificate_id );
        if ( ! empty( $certificate_object ) ) {
            if ( 'on' === $show_cert_title ) {
                $certificate_title = $certificate_object->post_title;
            } else {
                $certificate_title = $course->post_title;
            }
            $certificate_link = learndash_get_course_certificate_link( $course->ID, get_current_user_id() );

            if ( $certificate_link && '' !== $certificate_link ) {
                $date_earned                     = learndash_user_get_course_completed_date( get_current_user_id(), $course->ID );
                $certificate_list[ $certificate_id ] = [
                    'title'       => $certificate_title,
                    'course_id'   => $course->ID,
                    'date_earned' => $date_earned,
                    'link'        => $certificate_link
                ];
            }
        }
    }

    return $certificate_list;
}

Now we have a list of all user certificates, the next step is to get a single certificate PDF file.

REST Route for Single Certificate

This route will return a certificate file when you send a GET request including Certificate ID and Course ID to the URL:

http://yoursite.com/wp-json/yourproject/v1/certificate

add_action( 'rest_api_init', function () {
  register_rest_route( 'yourproject/v1', '/certificate', array(
    'methods' => 'GET',
    'callback' => 'yourproject_rest_certificate',
    'permission_callback' => '__return_true'
  ) );
} );

function yourproject_rest_certificate(WP_REST_Request $request){
    $cert_id = $request['cert_id'];
    $course_id = $request['course_id'];
    $user_id = get_current_user_id();
    $cert_post = get_post( $cert_id );
    $parsed = parse_blocks( $cert_post->post_content );
    $service = new PDF();
    return $service->serve( $parsed, $cert_id, $cert_id );
}

Note that we use Learndash PDF instance so you need to add this line on the top of your PHP file

use LearnDash_Certificate_Builder\Component\PDF;

And we assume you are using Learndash Certificate Builder.