it-swarm.com.de

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

WordPress verfügt über mehrere integrierte APIs:

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 Beispielen hier und hier zu folgen.

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

/**
 * 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';
  }
}

Aber ich konnte geschützte Metaschlüssel nicht in die Antwort einbeziehen.

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?

7
samy

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-Daten 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 in der Lage sein, Ihre Metadaten sowohl in /wp-json/wp/v2/tribe_venue/ als auch in /wp-json/wp/v2/tribe_venue/{POST_ID} anzuzeigen.

1
Levi Dulstein

Mit der REST-API gibt es einen rest_query_vars-Filter, 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. Schauen Sie sich den Quelllink unten an.

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

0
J.C. Hiatt