web-dev-qa-db-fra.com

Interrogation d'articles par taxonomie à partir d'un autre site réseau

J'ai 5 sites réseau dans ma configuration multisite WordPress.

L'un d'entre eux est le "site Web principal", sur lequel le reste des autres sites du réseau récupérera des données.

J'utilise actuellement WP_Query(); pour récupérer les publications et switch_to_blog()/restore_current_blog(); avant et après l'appel à WP_Query(); si le site actuel n'est pas le site principal.

Les messages récupérés sur le site principal sont récupérés correctement.

Lorsque je visite un autre site du réseau qui n'est PAS le site principal, celui-ci est censé basculer sur le site principal, récupérer des publications à partir d'un type de publication personnalisé ET d'une taxonomie personnalisée. Une fois les publications trouvées, restaurez le blog actuel.

Toutefois, les sous-sites ne renvoient aucun message. Je pensais que c'était étrange. J'ai donc vidé/comparé les résultats de WP_Query(); sur le site principal et sur l'un des sous-sites.

Notant spécifiquement la portion request de l'objet interrogé.

Demande sur le site Web principal:

[request] => SELECT SQL_CALC_FOUND_ROWS  ples_posts.ID FROM ples_posts  INNER JOIN ples_term_relationships ON (ples_posts.ID = ples_term_relationships.object_id) WHERE 1=1  AND ( ples_term_relationships.term_taxonomy_id IN (16) ) AND ples_posts.post_type = 'mbe-sales-listings' AND ((ples_posts.post_status = 'publish')) GROUP BY ples_posts.ID ORDER BY ples_posts.post_date DESC LIMIT 0, 5

Requête sur n'importe quel sous-site:

[request] => SELECT SQL_CALC_FOUND_ROWS  ples_posts.ID FROM ples_posts  WHERE 1=1  AND 0 = 1 AND ples_posts.post_type = 'mbe-sales-listings' AND ((ples_posts.post_status = 'publish')) GROUP BY ples_posts.ID ORDER BY ples_posts.post_date DESC LIMIT 0, 4

Les publications par page sont censées être différentes, alors peu importe.

Le fait est que, lorsque la requête est demandée à l’un des sous-sites, elle semble interroger le type de publication personnalisé, mais elle n’envisage même pas la taxonomie personnalisée.

Remarque:

Le type de publication personnalisé et toutes les taxonomies personnalisées pour ce type de publication personnalisée sont uniquement enregistrés sur le site principal.

Lors de l'enregistrement du type de publication personnalisé et de toutes les taxonomies personnalisées pour ce type de publication personnalisée sur tous les sous-sites, il récupère ensuite les publications comme prévu.

Je ne souhaite pas particulièrement enregistrer le type de message personnalisé ni aucune des taxonomies personnalisées sur l'un des sous-sites. Je veux seulement qu'ils soient enregistrés sur le site principal.

Maintenant que vous connaissez l'histoire complexe, voici la question ...

Existe-t-il un moyen de ne conserver que le type de publication personnalisé et toutes les taxonomies personnalisées enregistrées sur le site principal, tout en conservant la possibilité de récupérer les publications nécessaires dans l'un des sous-sites?

Je suppose que c'est possible avec une requête spéciale $wpdb; et NON possible avec switch_to_blog();, WP_Query(); et restore_current_blog();.

Si cela est possible en utilisant une requête $wpdb; spéciale, j'apprécierais des conseils sur une requête SQL sûre et appropriée afin de le faire. Je cherche simplement à interroger toutes les publications publiées à partir d'un identifiant de site, d'un type de publication et d'une taxonomie/terme spécifié.

1
Michael Ecklund

Après réflexion, j'ai proposé une "solution" possible. Cependant, ce n'était pas exactement la route que j'espérais emprunter.

Le type de publication personnalisé et toutes les taxonomies personnalisées pour ce type de publication personnalisée doivent être enregistrés sur TOUS les sites du réseau pour que WP_Query(); récupère les publications du site principal à partir de l'un des sous-sites du réseau.

Au moins en tant que solution temporaire, j'ai spécifié les paramètres suivants pour aider à "masquer" les types de publication personnalisés et les taxonomies personnalisées des sous-sites.

Tout d'abord, j'ai spécifié deux variables globales à utiliser dans mon plugin. Un pour l'ID de site principal et un autre pour l'ID de site actuel. Ces variables peuvent ensuite être globalisées dans n'importe quelle méthode ou fonction de classe.

$GLOBALS['mbe_primary_site_id'] = 1;
$GLOBALS['mbe_current_site_id'] = get_current_blog_id();

Lors de l'enregistrement du type de message personnalisé ... j'ai ajouté une vérification et modifié certains des arguments d'enregistrement du type de message.

global $mbe_primary_site_id, $mbe_current_site_id;
if($mbe_current_site_id != $mbe_primary_site_id){
    $args['show_ui'] = false;
    $args['public'] = false;
    $args['show_in_menu'] = false;
}

Lors de l'enregistrement des taxonomies personnalisées ... j'ai ajouté un chèque et modifié certains des arguments d'enregistrement de taxonomie.

global $mbe_primary_site_id, $mbe_current_site_id;
if($mbe_current_site_id != $mbe_primary_site_id){
    $args['show_ui'] = false;
    $args['public'] = false;
}

Alors maintenant, je peux interroger les articles par taxonomie depuis le site principal sur l’un des sous-sites tels que: switch_to_blog($mbe_primary_site_id);, WP_Query(...); et restore_current_blog();

Je ne sais pas s'il existe un moyen vraiment solide de contourner cela. Ce que je sais, c'est que cette méthode fonctionne et que si vous le faisiez via des requêtes $wpdb;, il y aurait assez de logique conditionnelle et de vérifications, surtout si vous envisagez de paginer le contenu.

Il serait plus pénible et fastidieux d’utiliser $wpdb; pour tout, lorsque vous pourriez simplement enregistrer les types de publication personnalisés et les taxonomies personnalisées sur les sous-sites, et simplement en masquer l’accès.

1
Michael Ecklund