2017-05-01 2 views
0

Ich habe einen benutzerdefinierten Post-Typ, card, den ich über die WP-REST-API verfügbar mache.WP REST API-Set-Berechtigung für vorhandene Endpunkte

function register_card_post_type() { 
    $labels = array(
     "name" => __('Cards', ''), 
     "singular_name" => __('Card', ''), 
    ); 

    $args = array(
     "label" => __('Cards', ''), 
     "labels" => $labels, 
     "description" => "", 
     "public" => true, 
     "publicly_queryable" => true, 
     "show_ui" => true, 
     "show_in_rest" => true, // ADD TO REST API 
     "rest_base" => "cards", // ADD TO REST API 
     "has_archive" => false, 
     "show_in_menu" => true, 
     "exclude_from_search" => false, 
     "capability_type" => "post", 
     "map_meta_cap" => true, 
     "hierarchical" => false, 
     "rewrite" => array("slug" => "card", "with_front" => true), 
     "query_var" => true, 
     "menu_position" => 5, 
     "supports" => array("title"), 
    ); 

    register_post_type("card", $args); 
} 

add_action('init', 'register_card_post_type'); 

Es scheint, als ob die Endpunkte standardmäßig öffentlich sind. Wie lege ich die Authentifizierungsanforderungen für den Endpunkt fest, sodass GET /cards/ entweder einen Authentifizierungs-Cookie oder einen Header benötigt?

Im API-Handbuch wird gezeigt, wie man einen benutzerdefinierten Endpunkt schreibt, aber im Idealfall gibt es einen Filter oder einen Hook, mit dem ich die automatisch generierten Endpunkte erweitern kann?

add_action('rest_api_init', function() { 
    register_rest_route('myplugin/v1', '/author/(?P<id>\d+)', array(
     'methods' => 'GET', 
     'callback' => 'my_awesome_func', 
     'args' => array(
      'id' => array(
       'validate_callback' => 'is_numeric' 
      ), 
     ), 
     'permission_callback' => function() { 
      return current_user_can('edit_others_posts'); 
     } 
    )); 
}); 

Antwort

3

können Sie die rest_pre_dispatch Filter verwenden, um die URL zu überprüfen, und den Zugang zu diesem Endpunkt widerrufen für nicht eingeloggte Benutzer:

add_filter('rest_pre_dispatch', function() { 
    $url = strtok($_SERVER["REQUEST_URI"],'?'); 
    if (!is_user_logged_in() && 
      !in_array($url, array (//using "in_array" because you can add mmultiple endpoints here 
         "/wp-json/cards", 
         ))){   
     return new WP_Error('not-logged-in', 'API Requests to '.$url.' are only supported for authenticated requests', array('status' => 401)); 
    } 
}); 

Dies ist nicht die beste Lösung, weil es die Abfrage und wird laufen filter das Ergebnis, aber ich benutze dies, bis eine Möglichkeit gefunden wird, den API-Zugriff zu blockieren, bevor die Abfrage ausgeführt wird.

Verwandte Themen