web-dev-qa-db-fra.com

Supprimer les entrées de base de données où post_date> date d'expiration

J'ai une heure de publication personnalisée qui a une date d'expiration. La date d'expiration est obtenue en obtenant le package_type de la publication (chaque type de package a un nombre différent de jours avant l'expiration, appelé "Jours vivants"), en extrayant la valeur pour alive_days et en l'ajoutant au post_date.

Je me demande s'il existe un moyen de supprimer tous les messages dont la date actuelle dépasse la date d'expiration.

$post_id = $post->ID; // get the post ID
$package_id = get_post_meta( $post_id, 'package_select', true ); // get the post's package
$transaction_price_pkg = $monetization->templ_get_price_info( $package_id, '' ); // get the package info
$alive_days = "+" . $transaction_price_pkg[0]['alive_days'] . " days"; // get the "alive days" of the given package

$expired_date = date('Y-m-d H:i:s',strtotime($alive_days, strtotime($post->post_date))); // calculate the expiration date

// Here's where I'm having trouble
$query = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}transactions WHERE {$expired_date >= NOW() ");

Un simple var_dump renvoie NULL. Pourquoi ce code ne fonctionne-t-il pas? (il peut y avoir plusieurs raisons ...)

2
Jillian Hoenig

Dans votre première phrase, je suppose que vous voulez dire que vous avez un type de message personnalisé (pas le temps).

Donc, la publication a un paquet connecté, le paquet a un nombre de jours actifs. En lisant votre exemple de code, je pense que vous abordez cette question sous le mauvais angle.

Je ferais quelque chose comme ça:

// I don't know how you want to call this function, i would use a daily cron-job
function remove_expired_posts() {

  $current_date = new DateTime();

  $args = array(
    'posts_per_page'   => -1,
    'post_type'        => 'YOUR_CUSTOM_POST_TYPE_NAME_HERE',
    'post_status'      => 'publish',
  );
  $posts = get_posts( $args );

  if($posts) {
    foreach($posts as $post) {

      $post_id = $post->ID;
      $post_date = DateTime::createFromFormat('Y-m-d H:i:s', $post->post_date');
      $package_id = get_post_meta( $post_id, 'package_select', true );
      $transaction_price_pkg = $monetization->templ_get_price_info( $package_id, '' ); // make sure you include the $monetization object
      $alive_days = (int)$transaction_price_pkg[0]['alive_days']; 

      $expire_date = $post_date->modify('+ '.$alive_days.' days');

      if($current_date > $expire_date) {
        wp_delete_post( $post_id, true ); // true means bypass bin.
      }
    }
  }
}

NOTE:
Je n'ai pas testé ce code, mais cela devrait fonctionner. Au moins, cela devrait vous donner une idée de la marche à suivre.

Regard, Bjorn

1
Bjorn