WordPress.org

Making WordPress.org

Changeset 4804


Ignore:
Timestamp:
01/26/2017 11:29:48 PM (4 years ago)
Author:
coreymckrill
Message:

WCPT: Enable a v2 REST endpoint for the WordCamp CPT

This endpoint mimics the posts endpoint, except with the following
modifications:

  • WCPT uses custom post statuses, more than one of which is considered public. The default REST response includes all posts with a public post status.
  • Since a response may contain posts of more than one post status, that property is exposed in the view context.
  • Several post meta fields are exposed in the view context.
Location:
sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-loader.php

    r4803 r4804  
    2222     */
    2323    function __construct() {
    24         add_action( 'plugins_loaded',      array( $this, 'includes'                          ) );
    25         add_action( 'init',                array( $this, 'register_post_types'               ) );
    26         add_action( 'init',                array( $this, 'register_post_statuses'            ) );
    27         add_filter( 'pre_get_posts',       array( $this, 'query_public_statuses_on_archives' ) );
    28         add_action( 'wp_insert_post_data', array( $this, 'set_scheduled_date'                ) );
    29         add_filter( 'wordcamp_rewrite_rules', array( $this, 'wordcamp_rewrite_rules' ) );
    30         add_filter( 'query_vars', array( $this, 'query_vars' ) );
     24        add_action( 'plugins_loaded',                  array( $this, 'includes'                          ) );
     25        add_action( 'init',                            array( $this, 'register_post_types'               ) );
     26        add_action( 'init',                            array( $this, 'register_post_statuses'            ) );
     27        add_filter( 'pre_get_posts',                   array( $this, 'query_public_statuses_on_archives' ) );
     28        add_action( 'wp_insert_post_data',             array( $this, 'set_scheduled_date'                ) );
     29        add_filter( 'wordcamp_rewrite_rules',          array( $this, 'wordcamp_rewrite_rules'            ) );
     30        add_filter( 'query_vars',                      array( $this, 'query_vars'                        ) );
     31        add_filter( 'rest_wordcamp_collection_params', array( $this, 'set_rest_post_status_default'      ) );
     32        add_action( 'rest_api_init',                   array( $this, 'register_rest_public_fields'       ) );
    3133    }
    3234
     
    4042    function includes () {
    4143        // Load the files
     44        require_once ( WCPT_DIR . 'wcpt-wordcamp/class-wp-rest-wordcamps-controller.php' );
    4245        require_once ( WCPT_DIR . 'wcpt-wordcamp/wordcamp-template.php' );
    4346
     
    9396        // Register WordCamp post type
    9497        register_post_type( WCPT_POST_TYPE_ID, array(
    95             'labels'            => $wcpt_labels,
    96             'rewrite'           => $wcpt_rewrite,
    97             'supports'          => $wcpt_supports,
    98             'menu_position'     => '100',
    99             'public'            => true,
    100             'show_ui'           => true,
    101             'can_export'        => true,
    102             'capability_type'   => 'post',
    103             'hierarchical'      => false,
    104             'has_archive'       => true,
    105             'query_var'         => true,
    106             'menu_icon'         => 'dashicons-wordpress',
     98            'labels'                => $wcpt_labels,
     99            'rewrite'               => $wcpt_rewrite,
     100            'supports'              => $wcpt_supports,
     101            'menu_position'         => '100',
     102            'public'                => true,
     103            'show_ui'               => true,
     104            'can_export'            => true,
     105            'capability_type'       => 'post',
     106            'hierarchical'          => false,
     107            'has_archive'           => true,
     108            'query_var'             => true,
     109            'menu_icon'             => 'dashicons-wordpress',
     110            'show_in_rest'          => true,
     111            'rest_base'             => 'wordcamps',
     112            'rest_controller_class' => 'WordCamp_REST_WordCamps_Controller',
    107113        ) );
    108114    }
     
    355361
    356362    /**
     363     * Meta field keys to publicly expose in the v2 REST API
     364     *
     365     * @see wcorg_json_expose_whitelisted_meta_data() in mu-plugins/wcorg-json-api.php
     366     *
     367     * @return array
     368     */
     369    public static function get_public_meta_keys() {
     370        return array(
     371            // Sourced from wcorg_json_expose_whitelisted_meta_data()
     372            'Start Date (YYYY-mm-dd)',
     373            'End Date (YYYY-mm-dd)',
     374            'Location',
     375            'URL',
     376            'Twitter',
     377            'WordCamp Hashtag',
     378            'Number of Anticipated Attendees',
     379            'Organizer Name',
     380            'WordPress.org Username',
     381            'Venue Name',
     382            'Physical Address',
     383            'Maximum Capacity',
     384            'Available Rooms',
     385            'Website URL',
     386            'Exhibition Space Available',
     387            // Additional venue data
     388            '_venue_coordinates',
     389            '_venue_city',
     390            '_venue_state',
     391            '_venue_country_code',
     392            '_venue_country_name',
     393            '_venue_zip',
     394        );
     395    }
     396
     397    /**
     398     * Register fields to publicly expose in the v2 REST API
     399     *
     400     * @hooked action rest_api_init
     401     */
     402    public function register_rest_public_fields() {
     403        $keys = self::get_public_meta_keys();
     404
     405        foreach ( $keys as $key ) {
     406            register_rest_field(
     407                'wordcamp',
     408                $key,
     409                array(
     410                    'get_callback' => function( $object, $field_name ) {
     411                        return get_post_meta( $object['id'], $field_name, true );
     412                    }
     413                )
     414            );
     415        }
     416    }
     417
     418    /**
     419     * Change the default status used for the WordCamp CPT in the v2 REST API.
     420     *
     421     * @hooked filter rest_wordcamp_collection_params
     422     *
     423     * @param array $query_params
     424     *
     425     * @return array
     426     */
     427    public function set_rest_post_status_default( $query_params ) {
     428        if ( isset( $query_params['status'] ) ) {
     429            $query_params['status']['default'] = WordCamp_Loader::get_public_post_statuses();
     430        }
     431
     432        return $query_params;
     433    }
     434
     435    /**
    357436     * Additional rules for the WordCamp post type.
    358437     *
Note: See TracChangeset for help on using the changeset viewer.