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

  • 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 1 mes, 2 semanas por  kallookoo.
Viendo 6 respuestas - 1 de 6 (de 6 total)
  • 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 1 mes, 2 semanas por  ppoveda.

    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 1 mes, 2 semanas por  kallookoo.
    • Esta respuesta fue modificada hace 1 mes, 2 semanas 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.

    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 1 mes, 2 semanas por  kallookoo.
    • Esta respuesta fue modificada hace 1 mes, 2 semanas 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 );
    }
Viendo 6 respuestas - 1 de 6 (de 6 total)
  • Debes estar registrado para responder a este tema.