web-dev-qa-db-fra.com

Mise en cache transitoire pour requête wp

J'ai lu sur le transitoire dans le codex et quelques questions et réponses ici.

Je développe donc une application Web basée sur wp. Cela fonctionne maintenant, mais je veux l'optimiser. Les utilisateurs gèrent le contenu régulièrement, de sorte que les opérations crud sont courantes. Pour cette raison, je ne souhaite pas utiliser la mise en cache de pages avec expirations.

Je souhaite implémenter des fonctions de mise en cache sur les opérations "get". Ceci est dans mon esprit:

  1. un utilisateur ajoute du contenu, remplit une liste
  2. je crée un "enregistrement" transitoire pour cet objet de liste et pour l'élément lui-même
  3. quand la liste change (mettre à jour, supprimer, créer), je supprime le cache précédent et ajoute le nouveau

J'utilise principalement WP_Query (posts et meta). Des questions:

Ai-je besoin de cette méthode de mise en cache, ou utiliser un cache transitoire avec wp_query n'aura pas un effet important?

Mon autre souci de mettre tous les résultats dans une autre table semble un peu hors de propos ..?!

2
Iamzozo

Pour mon plugin de témoignages WordPress, j'ai utilisé avec succès des éléments transitoires avec des dates d'expiration pour réduire les chargements de page de 0,1 à 0,5 seconde.

Utiliser les propres transitoires de WordPress est une bouée de sauvetage. Il est tellement plus facile d’emballer ou d’utiliser directement au besoin, puis de vous concentrer à nouveau sur la logique de l’application. Lancer un autre système de mise en cache est inutile. En outre, lorsque vous commencez à utiliser des plug-ins de mise en cache tels que W3 Total Cache et WP Super Cache, vous disposez de liens supplémentaires de mise en cache qui vont accélérer les choses.

À ce stade, les transitoires expirés remplissent votre table wp_options. Les futures versions de WordPress mieux gérer le nettoyage transitoire. Pour l'instant, vérifiez https://Gist.github.com/ScottPhillips/2907732 pour une purge transitoire planifiée ou intégrez-le dans votre application.

Depuis que je fais des plugins gratuits et premium, j'ai résumé les opérations de cache, mais il n'y a aucune raison pour que vous ne puissiez pas transférer mes abstractions dans votre propre travail.

Dans votre cas, vous parlez d'utilisateurs qui créent des données, vous pouvez imaginer que cette création de données est le widget ou les options de code court qui sont passées dans testimonialswidget_list en tant que $atts ci-dessous.

La $content = apply_filters( 'testimonials_widget_cache_get', false, $atts ); vérifie qu'il existe une entrée de cache actuelle pour le $atts donné. En tant que tel, si les $atts entrants ont changé, la mise en cache échouera et false sera renvoyé afin qu'un nouvel ensemble de données soit créé.

La ligne $content = apply_filters( 'testimonials_widget_cache_set', $content, $atts ); est l'endroit où nos données nouvellement générées sont sauvegardées dans le cache pour une réutilisation rapide et facile.

La saisie de données à partir de testimonials-widget.php .

public function testimonialswidget_list( $atts ) {
    self::add_instance();

    $atts = wp_parse_args( $atts, self::get_defaults() );
    $atts = Testimonials_Widget_Settings::validate_settings( $atts );

    if ( get_query_var( 'paged' ) ) {
        $atts['paged'] = get_query_var( 'paged' );
    } elseif ( get_query_var( 'page' ) ) {
        $atts['paged'] = get_query_var( 'page' );
    } else {
        $atts['paged'] = 1;
    }

    $atts['type'] = 'testimonialswidget_list';

    $content = apply_filters( 'testimonials_widget_cache_get', false, $atts );

    if ( false === $content ) {
        $testimonials = self::get_testimonials( $atts );
        $content      = self::get_testimonials_html( $testimonials, $atts );
        $content      = apply_filters( 'testimonials_widget_cache_set', $content, $atts );
    }

    return $content;
}

Les opérations de mise en cache

add_filter( 'testimonials_widget_cache_get', array( $this, 'cache_get' ) );
add_filter( 'testimonials_widget_cache_set', array( $this, 'cache_set' ), 10, 2 );
public static function cache_get( $args ) {
    $hash     = self::create_hash( $args );
    $do_cache = apply_filters( 'testimonials_widget_disable_cache', true );
    $no_cache = isset( $args['no_cache'] ) && Testimonials_Widget_Settings::is_true( $args['no_cache'] );
    if ( ! $do_cache || $no_cache ) {
        delete_transient( $hash );
        return false;
    }

    $data = get_transient( $hash );

    return $data;
}


public static function cache_set( $data, $args ) {
    $hash = self::create_hash( $args );
    set_transient( $hash, $data, self::$cache_period );

    return $data;
}

Note Le code ci-dessus sont des notes. Copier et coller dans votre propre application ne fonctionnera pas comme prévu. Je suggérerais de regarder où self:: et Testimonials_Widget_Settings:: sont utilisés comme points probables pour modifier le code en fonction de vos besoins.

2
Michael Cannon