web-dev-qa-db-fra.com

Afficher le message populaire sur un autre site php via WP REST API JSON

Je dois afficher les publications populaires et récentes sur un autre site Web PHP sous le même domaine.

Exemple:

  1. www.example.com -> site principal (php, mysql)
  2. www.example.com/blog -> blog WordPress

Besoin d'afficher les récents messages populaires du blog sur le site principal.

Veuillez noter que le blog et le site principal utilisent deux bases de données distinctes.

J'ai décidé d'utiliser le WP REST _ API JSON plugin pour cela. Maintenant, j'ai une question différente.

J'utilise le code suivant pour récupérer le post populaire de la semaine dernière. Ce dont j'ai réellement besoin, c'est d'obtenir ces mêmes données via un appel API.

$args = array(
    'date_query' => array( array( 'after' => '1 week ago' ) ),  
    'posts_per_page' => $recent_posts_count,
    'ignore_sticky_posts' => 1,
    'meta_key' => 'post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC'
);
$popularposts = new WP_Query( $args );

Comment puis je faire ça?

9
Janith Chinthana

Je vais vous donner une petite réponse à votre mise à jour en le faisant avec le WP API . Les API ont la possibilité d'utiliser WP_Query comme dans core, mais sur les paramètres get dans l'URL.

Une URL pour extraire le contenu de Post Status ressemblerait à ceci:

http://example.com/wp-json/posts

Pour extraire du contenu avec les paramètres WP_Query auxquels vous êtes habitué, vous pouvez le faire comme suit:

http://example.com/wp-json/posts?filter[posts_per_page]=2&filter[order]=ASC

Vous pouvez créer votre requête personnalisée avec tous les paramètres également dans l'URL. Vous pouvez voir à quel point la méthode de récupération de ces données vous semble familière avec l'utilisation de WP_Query pour une boucle WordPress standard. Si vous ne spécifiez pas de paramètre, la valeur par défaut de WP_Query sera utilisée.

Le résultat est JSON, que vous pouvez analyser et utiliser pour votre site externe.

Voir aussi le site de l'API pour plus de paramètres et de documentation.

Mise à jour pour date_query

L'API ne peut pas créer de résultat pour une requête telle que query_date. Voir le documentation pour tous les paramètres possibles.

Mais la nouvelle version sortira dans les jours, les semaines et les jours. Et voyez ceci issue pour une discussion sur une solution pour cette requête de date. Vous pouvez également utiliser un filtre personnalisé via un crochet, par exemple:

// Allow datequery in /posts filter
add_filter( "json_query_vars", function( $query_args ) {
    return array_merge( $query_args, 
        array( "date_query" => array( array( "after" => "1 week ago" ) ) )
    );
} );

Mise à jour pour meta_query

L'API ne peut pas aussi cette fonctionnalité de la requête WP par défaut. Mais vous pouvez utiliser un crochet pour améliorer l’API en fonction de cette exigence. Aussi ici un petit exemple.

add_filter('json_query_var-meta_query', 'add_meta_query', 10, 1);

function add_meta_query( $data ){

    $args = array();
    $args['relation'] = 'AND';

    foreach ( $data as $key => $value ) {
        if ( 'relation' === $key ) {
            $args['relation'] = $data['relation'];
        }

        if ( substr($key, 0, 3) === 'key' ) {
            $arg_num = substr( $key, 3 );
            $args[ (int) $arg_num ][ 'key' ] = $value;
        }

        if (  substr( $key, 0, 7 ) === 'compare' ) {
            $arg_num_comp = substr( $key, 7 );
            $args[ (int) $arg_num_comp ][ 'compare' ] = $value;
        }
    }

    return $args;
}

Maintenant, je peux appeler JSON comme reposant pour imiter le filtre de publications Wp_query déjà sur le serveur:

?filter[meta_query][key]=_newsml_categories_newsstream&filter[meta_query][key2]=homepage&filter[meta_query][relation]=AND&filter[meta_query][compare]=NOT%20EXISTS&filter[meta_query][compare2]=NOT%20EXISTS

La méta requête mise à jour basée sur cette réponse .

8
bueltge