Gibt es eine Möglichkeit, geschützte Metafelder über eine der verfügbaren integrierten WordPress-APIs abzurufen? (xmlrpc, wp-json)

7

In WordPress sind mehrere APIs integriert:

Standardmäßig geben sie keine benutzerdefinierten Beitragstypen oder geschützten Metaschlüssel zurück.

Ich möchte auf die geschützten Metafelder eines Plugins zugreifen. Ich habe versucht, den hier und hier gegebenen Beispielen zu folgen .

Ich habe es geschafft, dass die wp-json-API benutzerdefinierte Beitragstypen zurückgibt, indem ich diesen Code hinzufüge:

/**
 * Add REST API support to an already registered post type.
 */
add_action( 'init', 'my_custom_post_type_rest_support', 25 );

function my_custom_post_type_rest_support() {

  global $wp_post_types;

  // be sure to set this to the name of your post type!
  $post_type_name = 'tribe_venue';

  if( isset( $wp_post_types[ $post_type_name ] ) ) {
      $wp_post_types[$post_type_name]->show_in_rest = true;
      $wp_post_types[$post_type_name]->rest_base = $post_type_name;
      $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller';
  }

  $post_type_name2 = 'tribe_events';

  if( isset( $wp_post_types[ $post_type_name2 ] ) ) {
      $wp_post_types[$post_type_name2]->show_in_rest = true;
      $wp_post_types[$post_type_name2]->rest_base = $post_type_name2;
      $wp_post_types[$post_type_name2]->rest_controller_class = 'WP_REST_Posts_Controller';
  }
}

Ich konnte jedoch keine geschützten Metaschlüssel in die Antwort aufnehmen.

Ich habe den folgenden Code ausprobiert:

add_filter( 'is_protected_meta', function ( $protected, $key, $type ) {
    if ( $type === 'tribe_venue' && $key === '_VenueVenue' ) {
        return true;
    }
    return $protected;
}, 10, 3 );

add_filter( 'rae_include_protected_meta', '__return_true' );

und den folgenden Code:

function custom_rest_api_allowed_public_metadata($allowed_meta_keys){
    $allowed_meta_keys[] = '_VenueVenue';
    $allowed_meta_keys[] = '_VenueAddress';
    $allowed_meta_keys[] = '_VenueCity';
    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

aber beides funktioniert nicht.

Weiß jemand, was benötigt wird, um solche geschützten Felder über eine der APIs zugänglich zu machen? Gibt es irgendwo ein funktionierendes Beispiel?

Samy
quelle
Ist es Ihr Ziel, sie in die Standardrouten aufzunehmen, oder nur eine Lösung wie das Erstellen einer benutzerdefinierten Route / eines benutzerdefinierten Endpunkts?
Kraftner

Antworten:

1

Für mich wäre die einfachste Lösung, ein zusätzliches Feld in der JSON-Antwort zu erstellen und es mit ausgewählten Post-Meta zu füllen:

function create_api_posts_meta_field() {

    // "tribe_venue" is your post type name, 
    // "protected-fields" is a name for new JSON field

    register_rest_field( 'tribe_venue', 'protected-fields', [
        'get_callback' => 'get_post_meta_for_api',
        'schema' => null,
    ] );
}

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

/**
 * Callback function to populate our JSON field
 */
function get_post_meta_for_api( $object ) {

    $meta = get_post_meta( $object['id'] );

    return [
        'venue'   => $meta['_VenueVenue']   ?: '',
        'address' => $meta['_VenueAddress'] ?: '',
        'city'    => $meta['_VenueCity']    ?: '',
    ];
}

Sie sollten Ihre Meta - Daten in der Lage sein zu sehen , sowohl in /wp-json/wp/v2/tribe_venue/und /wp-json/wp/v2/tribe_venue/{POST_ID}

Levi Dulstein
quelle
0

Mit der REST-API gibt es einen rest_query_varsFilter, den Sie verwenden können:

function my_allow_meta_query( $valid_vars ) {

    $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value') );

    return $valid_vars;
}

add_filter( 'rest_query_vars', 'my_allow_meta_query' );

Auf diese Weise können Sie eine Route wie diese verwenden, um ein Metafeld abzufragen:

wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE

Es gibt auch komplexere Möglichkeiten, wie Sie dies tun können. Überprüfen Sie den Quelllink unten.

Quelle: https://1fix.io/blog/2015/07/20/query-vars-wp-api/

JC Hiatt
quelle