Wie kann man zwischengespeicherte Transienten aus einer Widget-Instanz löschen?

Also habe ich dieses Widget erstellt, das eine Reihe von Posts zieht. Und die Abfrage wird über Transienten zwischengespeichert. Aber ich brauche den Transient, der gelöscht wird, wenn ein Post gespeichert wird, damit die Abfrage aktualisiert werden kann.

Sehen Sie sich dieses Code-Snippet an.

add_action( 'save_post', 'delete_transient' ); function delete_transient() { if ( $_POST['post_type'] === 'post' ) { // this is a hack around to delete widget transients $max = 20; for( $i = 1; $i <= $max; $i++ ) { delete_transient( 'my-posts-widget-' . $i ); } } } 

Ok, also alles einrichten und arbeiten, aber weil ein Widget mehrere Instanzen haben kann, wird das Löschen der Transienten ein Problem. Hier ist warum. Jedes Mal, wenn Sie ein Widget in die Seitenleiste einfügen, wird die eindeutige Nummer, die WP zuweist, inkrementiert. Wenn also jemand das Widget herauszieht und es dann wieder zurückstellt, wird die Nummer erneut erhöht. Also wird mein $ max = 20 bald nicht mehr gültig sein, da die ID dann 30 sein könnte … Ich könnte $ max auf 100000+ setzen, aber das ist nicht praktisch.

In diesem Sinne können Sie sehen, dass dies keine voll funktionsfähige Lösung ist. Meine Frage ist also, wie gehst du damit um oder hast du eine Idee von einer Arbeit?

Danke fürs schauen.

Solutions Collecting From Web of "Wie kann man zwischengespeicherte Transienten aus einer Widget-Instanz löschen?"

Verwenden Sie einen Widget-Cache und vergessen Sie die tatsächliche Anzahl aktiver Widgets.

Fügen Sie dieses in Ihrem widget() Ihrem Methoden- widget() :

 public function widget( $args, $instance ) { // get the cache $cache = wp_cache_get( 'UNIQUE_WIDGET_IDENTIFIER', 'widget' ); if ( !is_array( $cache ) ) $cache = array(); if ( ! isset ( $args['widget_id'] ) ) $args['widget_id'] = $this->id; if ( isset ( $cache[ $args['widget_id'] ] ) ) return print $cache[ $args['widget_id'] ]; // go on with your widget logic, put everything into a string and … $cache[ $args['widget_id'] ] = $widget_string; wp_cache_set( 'UNIQUE_WIDGET_IDENTIFIER', $cache, 'widget' ); print $widget_string; } 

Und in Ihrem Widget __construct() registrieren Sie die Flush-Aktionen:

 add_action( 'save_post', array( $this, 'flush_widget_cache' ) ); add_action( 'deleted_post', array( $this, 'flush_widget_cache' ) ); add_action( 'switch_theme', array( $this, 'flush_widget_cache' ) ); 

Der callback in Ihrer Widget-class ist nur ein einfacher …

 public function flush_widget_cache() { wp_cache_delete( 'UNIQUE_WIDGET_IDENTIFIER', 'widget' ); } 

Transienten Timeout auch wenn sich nichts geändert hat. Das brauchst du hier nicht.
Vergessen Sie nicht, UNIQUE_WIDGET_IDENTIFIER durch Ihren eigenen Wert zu ersetzen. 🙂

Also habe ich diese Hacky-Arbeit für den Moment erfunden, aber es funktioniert.

 add_action( 'save_post', 'delete_transient' ); function delete_transient() { if ( $_POST['post_type'] === 'post' ) { $ids = get_widget_id_number(); foreach( $ids as $id ) { delete_transient( 'my-posts-widget-' . $id ); } } } function get_widget_id_number() { $widgets = get_option( 'sidebars_widgets' ); $widget_ids = array(); foreach( $widgets as $widget ) { if ( is_array( $widget ) ) { foreach( $widget as $widget_saved ) { $widget_saved_name = substr( $widget_saved, 0, strrpos( $widget_saved, '-' ) ); $widget_id = substr( $widget_saved, -1, strrpos( $widget_saved, '-' ) ); if ( $widget_saved_name === 'my-posts-widget' ) $widget_ids[] = $widget_id; } } } array_unique( $widget_ids ); return $widget_ids; } 

Hoffnung, die anderen in dieser Situation helfen wird.