Afficher un article populaire sur un autre site Web php via WP REST JSON API

9

J'ai besoin d'afficher des articles populaires et récents 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 des articles de blog populaires et récents sur le site Web principal.

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

J'ai décidé d'utiliser le plugin WP REST JSON API 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?

Janith Chinthana
la source
Cela a été demandé à maintes reprises. Veuillez utiliser la recherche.
kraftner
1. Si vous avez une nouvelle question, veuillez ouvrir une nouvelle question. Dans ce cas, cela pourrait être correct car ce n'est pas totalement nouveau. Quoi qu'il en soit, le titre est trompeur maintenant. 2. Vous avez vu la documentation: wp-api.org
kraftner
J'ai également mis à jour le titre, mais je passerai en revue le document, merci
Janith Chinthana

Réponses:

8

Je vais vous donner une petite réponse à votre mise à jour, en faisant cela avec l' API WP . L'API a la possibilité d'utiliser le WP_Query comme aussi dans le noyau, mais sur les paramètres get dans l'url.

Une URL pour extraire le contenu du statut de publication 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 ceci:

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 comment la méthode pour récupérer ces données semble familière à utiliser WP_Querypour une boucle WordPress standard. Si vous ne spécifiez aucun paramètre, les valeurs par défaut WP_Queryseront utilisées.

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

Voir également 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 comme query_date. Voir la documentation pour tous les paramètres possibles.

Mais la nouvelle version sortira en vue des jours, des semaines. Et consultez ce problème pour discuter d'une solution pour cette requête de date. Vous pouvez également utiliser un filtre personnalisé via un crochet, comme:

// 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 également cette fonctionnalité de WP-Query par défaut. Mais vous pouvez utiliser un crochet pour améliorer l'API à cette exigence. Ici aussi 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 reposant comme ça pour imiter le filtre de messages 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 mise à jour de la méta-requête basée sur cette réponse .

bueltge
la source
Avez-vous une idée de la façon de convertir la ligne 'date_query' => array( array( 'after' => '1 week ago' ) ), en chaîne de requête
Janith Chinthana
Je voudrais accepter ceci comme une réponse, mais si vous avez une idée concernant le commentaire ci-dessus, vous pouvez partager vos pensées.
Janith Chinthana
les filtres autres que ceux- filter[posts_per_page]=2&filter[order]=ASCci ne fonctionnent pas, donc ils ne donnent que des articles récents
Janith Chinthana
@JanithChinthana J'ai testé à nouveau, le paramètre de filtre fonctionne très bien. - Comme exemple http://localhost/wpbeta/plugins/wp-json/posts?filter[posts_per_page]=1&filter[order]=ASC. Beaucoup plus dans ma mise à jour ci-dessous dans la réponse.
bueltge
merci pour la mise à jour, oui post_per_pageet orderfonctionne, mais qu'en est-il meta_key. ça marche avec ça ou j'ai besoin de travail supplémentaire pour ça?
Janith Chinthana