Soporte » WordPress Avanzado » Mejor metodo para eliminar multiple options y transients

  • ResueltoModerador kallookoo

    (@kallookoo)


    Buenas,
    Estoy trabajando en un plugin y me ha surgido una duda.

    Pongamos que se crean en varias classes una option dinamicamente y posibles transient no caducables o que por algun motivo no se eliminaron y todo tiene el mismo prefijo.

    Lo suyo seria saber el nombre y añadirlo al metodo de eliminacion, esta claro.
    Pero y sino fuese el caso.

    Habia pensado en dos formas, ojo no estan probadas
    Primera option:
    1.- Busco todos los valores
    2.- LLamo a la function correspondiente, para asi tambien llamar a WP_Object_Cache para eliminar el cache.

    
    global $wpdb;
    $like   = '%' . $wpdb->esc_like( 'my_option_prefix' ) . '%'; /** Option name prefix */
    $nolike = '%' . $wpdb->esc_like( 'timeout' ) . '%'; /** Exclude transient timeout*/
    $names  = $wpdb->get_col(
      $wpdb->prepare(
        "SELECT option_name FROM $wpdb->options WHERE option_name LIKE %s AND option_name NOT LIKE %s",
        $like,
        $nolike
      )
    );
    foreach ( $names as $name ) {
      $func = ( false === strpos( $name, 'transient' ) ) ? 'delete_option' : 'delete_transient';
      call_user_func( $func, $name );
    }
    

    Segunda option:
    1.- Elimino directamente todo de la db y nos olvidamos de WP_Object_Cache

    
    global $wpdb;
    $like = '%' . $wpdb->esc_like( 'my_option_prefix' ) . '%';
    $wpdb->query( $wpdb->prepare( "DELETED FROM $wpdb->options WHERE option_name LIKE %s", $like ) );
    

    Que opinais? O se os ocurre otro metodo.

    • Este debate fue modificado hace 5 años, 5 meses por kallookoo.
Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • Desde hace tiempo dejé de usar queries a pelo, siempre que puedo las evito.
    ¿Te hace falta que sea a través de interfaz?
    Siempre puedes probar si wp-cli te encaja para hacer todo eso, te vas ahorrar mucho tiempo y curro.
    https://developer.wordpress.org/cli/commands/transient/

    • Esta respuesta fue modificada hace 5 años, 5 meses por ppoveda.
    Moderador kallookoo

    (@kallookoo)

    Hola, @ppoveda

    No me hace falta, solo queria saber que opinais al respecto sobre como eliminar todos los posibles datos guardados en la db, cuando se creasen dinamicamente.

    El wp no seria una opcion ya que seria para implementarlo en un plugin.

    Igualmente gracias por dar tu opinion

    • Esta respuesta fue modificada hace 5 años, 5 meses por kallookoo.
    • Esta respuesta fue modificada hace 5 años, 5 meses por kallookoo. Razón: No se escribir, :)

    OK, no te había entendido.

    Soy de la opinión de no arrastrar lastre. Si hay options en la DB que ya no usas y no las vas a usar más, bórralas. El trabajo de mantener la BD tanto de options como de metas es importante.

    Suerte con eso.

    Yo utilizaría la primera función, pero eliminaría el primer % ya que así limitamos el query a los que comiencen con dicho prefijo, no a todos los que lo contengan, es decir:

    $like = $wpdb->esc_like( 'my_option_prefix' ) . '%'; /** Option name prefix */

    En el segundo ejemplo se te escapó un DELETED en vez de DELETE

    Saludos.

    Moderador kallookoo

    (@kallookoo)

    Buena observacion sobre lo del %, pero para los transients no funcionaria ya que empiezan con _site_transient_
    y es verdad me equivoque escribiendo el DELETE pero no puedo editarlo 🙁

    Gracias por tu aportacion…

    • Esta respuesta fue modificada hace 5 años, 4 meses por kallookoo.
    • Esta respuesta fue modificada hace 5 años, 4 meses por kallookoo.

    Cierto @kallookoo con lo que lo mejor sería con el primer %, pero sólo por aportar otra forma, también podría ser (pero me quedaría con la tuya):

    global $wpdb;
    $like1   = $wpdb->esc_like( 'my_option_prefix' ) . '%'; /** Option name prefix */
    $like2   = $wpdb->esc_like( '_site_transient_my_option_prefix' ) . '%'; /** Option name prefix */
    $nolike = '%' . $wpdb->esc_like( 'timeout' ) . '%'; /** Exclude transient timeout*/
    $names  = $wpdb->get_col(
      $wpdb->prepare(
        "SELECT option_name FROM $wpdb->options WHERE (option_name LIKE %s OR option_name LIKE %s) AND option_name NOT LIKE %s",
        $like1,
        $like2,
        $nolike
      )
    );
    foreach ( $names as $name ) {
      $func = ( false === strpos( $name, 'transient' ) ) ? 'delete_option' : 'delete_transient';
      call_user_func( $func, $name );
    }
    Moderador kallookoo

    (@kallookoo)

    Revisando mis preguntas he visto esta y añado el codigo que puse en uninstall.php

    
    $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '%plugin\_name%'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery
    

    Opte por usar el mismo nombre tanto para option como transient asi de una tirada elimina la o las options y tanto el transient como el lifetime del transient.

Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • El debate ‘Mejor metodo para eliminar multiple options y transients’ está cerrado a nuevas respuestas.