Donar

Cambiar el estatus de las publicaciones al finalizar una suscripción del usuario

Cambiar el estatus de las publicaciones al finalizar una suscripción del usuario
PRO

Actualmente en un proyecto que trata sobre una plataforma de anuncios tenía un gran problema con las suscripciones de los usuarios la cual les permite registrarse y tener una suscripción activa para poder publicar anuncios, ¿El inconveniente? era que los anuncios activos seguían activos si al usuario se le había vencido/caducado su suscripción. Esto era un gran problema ya que no debían estar activo y deberían pasar al estatus de borrador (draft).

Aquí las suscripciones funcionan con WooCommerce Subscriptions

¿La solución?

Crear una función personalizada la cual verifica el estatus de la suscripción de todos los usuarios y si alguna de ellas ya caducó, cambiar el estatus de los anuncios asociados a dicho usuario.

function pasar_anuncios_a_borrador_al_vencer( $subscription, $new_status, $old_status ) {

    // Lista de estados que consideramos como "inactivos"
    $inactive_statuses = ['expired', 'cancelled', 'on-hold', 'wc-expired', 'wc-cancelled', 'wc-on-hold'];

    // Si el nuevo estado no está en nuestra lista de inactivos, no hacemos nada.
    if ( !in_array( $new_status, $inactive_statuses ) ) {
        return;
    }

    // Obtenemos el ID del usuario dueño de la suscripción
    $user_id = $subscription->get_user_id();
    if ( ! $user_id ) {
        return; // Salimos si no hay un usuario asociado
    }

    // Argumentos para buscar todos los anuncios (posts) publicados de este usuario
    $args = array(
        'author'         => $user_id,
        'post_type'      => 'post',       // Usando las entradas por defecto como anuncios
        'post_status'    => 'publish',    // Solo queremos afectar los que están publicados
        'posts_per_page' => -1,           // -1 significa "todos los posts"
    );

    $author_posts = new WP_Query( $args );

    if ( $author_posts->have_posts() ) {
        // Si se encuentran posts, recorremos cada uno de ellos
        while ( $author_posts->have_posts() ) {
            $author_posts->the_post();

            // Creamos un array con los datos a actualizar del post
            $updated_post = array(
                'ID'          => get_the_ID(),
                'post_status' => 'draft', // Cambiamos el estado a borrador
            );

            // Actualizamos el post en la base de datos
            wp_update_post( $updated_post );
        }
    }
    
    // Restablecemos los datos de la consulta de WordPress
    wp_reset_postdata();
}

// Enganchamos nuestra función al hook de WooCommerce Subscriptions que se activa cuando cambia un estado
add_action( 'woocommerce_subscription_status_updated', 'pasar_anuncios_a_borrador_al_vencer', 10, 3 );


/**
 * =================================================================================
 * FUNCIÓN 2: REACTIVAR ANUNCIOS CUANDO EL USUARIO RENUEVA LA SUSCRIPCIÓN (OPCIONAL)
 * =================================================================================
 *
 * Esta función se ejecuta cuando una suscripción pasa a estar 'active' (activa).
 * Busca todos los posts en 'draft' (borrador) del usuario y los vuelve a publicar.
 */
function republicar_anuncios_al_reactivar( $subscription ) {
    
    // Obtenemos el ID del usuario dueño de la suscripción
    $user_id = $subscription->get_user_id();
    if ( ! $user_id ) {
        return; // Salimos si no hay un usuario asociado
    }

    // Argumentos para buscar todos los anuncios (posts) en borrador de este usuario
    $args = array(
        'author'         => $user_id,
        'post_type'      => 'post',
        'post_status'    => 'draft', // Solo queremos afectar los que están en borrador
        'posts_per_page' => -1,
    );

    $author_posts = new WP_Query( $args );

    if ( $author_posts->have_posts() ) {
        while ( $author_posts->have_posts() ) {
            $author_posts->the_post();

            $updated_post = array(
                'ID'          => get_the_ID(),
                'post_status' => 'publish', // Cambiamos el estado a publicado
            );

            wp_update_post( $updated_post );
        }
    }
    
    wp_reset_postdata();
}

// Enganchamos esta segunda función a un hook diferente que se activa solo cuando una suscripción pasa a activa
add_action( 'woocommerce_subscription_payment_complete', 'republicar_anuncios_al_reactivar' );
add_action( 'woocommerce_subscription_activated', 'republicar_anuncios_al_reactivar' );
PHP

Hola, que bueno verte otra vez!

o

Regístrate