web-dev-qa-db-fra.com

Passer le même objet à plusieurs widgets dans un modèle avec une requête

Je cherche actuellement à transmettre une requête unique à plusieurs widgets sur un modèle sans exécuter plusieurs requêtes. L'objectif évident est la rapidité et l'efficacité.

J'ai un widget qui fournira des aspects spécifiques du même objet avec différentes instances du widget dans le modèle. Les instances de widget sont un doit , mais l'instance d'objet doit rester inchangée. Existe-t-il un point d’intérêt dans la série d’actions et de filtres que je devrais rechercher dans mon widget?

Par exemple, je veux que object->title apparaisse dans mon widget en haut de la page, je coche donc cette case et l’affiche donc dans cette zone. Ensuite, j'ai une autre instance du widget où je vérifie que object->content s'affiche dans cette zone.

C'est très facile à l'intérieur du widget, cependant, très inefficace parce que je viens de lancer deux requêtes pour le même objet, car mes widgets sont deux objets différents en eux-mêmes.

Comment mon widget ne peut-il pas tenter deux fois la même requête dans cette situation? get_queried_object lancera-t-il une requête pour ces deux instances de widget?

2
Nathan Powell

Je suggère d'utiliser l'API de cache d'objets ou l'API transitoires , comme bon vous semble améliorer vos besoins.

Un exemple très rapide avec le cache d'objets:

// helper function
function get_my_object() {
    $object = wp_cache_get( 'my_object' );
    if ( false === $object ) {
        $args = array( .... );
        $object = new WP_Query( $args );
        wp_cache_set( 'my_object', $object );
    } 
    return $object;
}

class cyb_my_widget extends WP_Widget {

    function __construct() {
        // ...
    }

    function widget( $args, $instance ) {
        // ...
        $object = get_my_object();
    }

    function update( $new_instance, $old_instance ) {
        // ...
    }

    function form( $instance ) {
       // ...
    }
}
3
cybmeta

Le moyen le plus simple serait de générer une variable globale ou transitoire (si vous souhaitez utiliser l'objet sur plusieurs pages) dans votre modèle et disposer des widgets. accéder à cela.

Une approche plus judicieuse du point de vue du programme représenterait un travail considérable et se déroulerait comme suit:

  1. Construisez un widget qui exécute la requête et renvoie votre objet. Normalement, une instance WP_widget utilisera le constructeur du parent pour s'initialiser. Toutefois, lorsque vous étendez la classe WP_Widget, vous pouvez également inclure un constructeur supplémentaire. Ici, vous générez la possibilité de passer un argument supplémentaire à une instance de widget, votre objet.
  2. Les autres widgets que vous définissez ne sont pas des extensions de WP_Widget, mais des extensions de votre widget parent, ils peuvent donc prendre un argument supplémentaire.
  3. Dans le widget parent, utilisez the_widget pour afficher d'autres widgets, en passant l'objet .

Je suis sûr qu'il doit y avoir d'autres approches, mais c'est le cours que j'explorerais. Note: Je n'ai pas ressenti le besoin de faire quelque chose comme ça, donc cette approche est proposée "telle quelle".

0
cjbj