es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambiar el estado de las publicaciones a publicado basándose en el rol del usuario.

Tengo un sitio de miembros donde los usuarios deben pagar para suscribirse. Cuando un usuario se suscribe, su rol se convierte en “miembro” y ahora puede publicar en un tipo de publicación personalizado llamado “actividad”.

Sin embargo, si su suscripción finaliza, automáticamente vuelve a un rol estándar. El código funciona con este artículo: https://stackoverflow.com/questions/40591580/change-posts-status-to-pending-based-on-user-role

Me gustaría hacer lo contrario, siguiendo el mismo modelo que el artículo anterior. Es decir, si el usuario vuelve a comprar una suscripción, se publicarán todas sus publicaciones.

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Para lograr el resultado deseado, debemos modificar el código proporcionado en el artículo cambiando ligeramente la lógica. En lugar de verificar si el rol del usuario es “suscriptor” y cambiar el estado de la publicación a “pendiente”, debemos verificar si el rol del usuario es “miembro” y establecer el estado de la publicación en “publicado”. Aquí están los pasos para lograr esto:

    1. Primero, necesitamos agregar un campo meta personalizado a cada publicación del tipo de publicación personalizado “actividad” para almacenar el ID del usuario que publicó la publicación. Podemos usar la función update_post_meta () para establecer este valor cuando un usuario “miembro” publica una publicación.
    function set_activity_author_meta($post_id) {
        $user_id = get_current_user_id();
        update_post_meta($post_id, '_activity_author', $user_id);
    }
    add_action('publish_activity', 'set_activity_author_meta');
    
    1. A continuación, necesitamos agregar un filtro al gancho pre_get_posts para modificar la consulta y mostrar solo publicaciones con el ID del usuario como campo meta personalizado. Podemos usar la función get_current_user_id () para obtener el ID del usuario actual y el parámetro meta_query para filtrar las publicaciones.
    function show_user_activity($query) {
        if (is_admin() || !is_post_type_archive('activity') || !is_main_query()) {
            return;
        }
        $user_id = get_current_user_id();
        $meta_query = array(
            array(
                'key' => '_activity_author',
                'value' => $user_id,
            ),
        );
        $query->set('meta_query', $meta_query);
    }
    add_action('pre_get_posts', 'show_user_activity');
    
    1. Finalmente, necesitamos modificar el gancho publish_post para verificar si el rol del usuario es “miembro” y cambiar el estado de la publicación a “publicado” si hay publicaciones existentes que coinciden con el ID del usuario.
    function publish_user_activity($post_id) {
        $user_id = get_post_meta($post_id, '_activity_author', true);
        if (!$user_id) {
            return;
        }
        $user = get_userdata($user_id);
        if (in_array('member', $user->roles)) {
            $args = array(
                'post_type' => 'activity',
                'meta_key' => '_activity_author',
                'meta_value' => $user_id,
            );
            $posts = get_posts($args);
            foreach ($posts as $post) {
                wp_update_post(array(
                    'ID' => $post->ID,
                    'post_status' => 'publish',
                ));
            }
        }
    }
    add_action('publish_post', 'publish_user_activity');
    

    Este código garantizará que cuando un usuario vuelva a comprar una suscripción y su rol cambie a “miembro”, todas sus publicaciones existentes se publiquen. Tenga en cuenta que este código asume que solo se asignará un usuario como autor de una publicación y que el ID del usuario se guardará como un campo meta personalizado. Si tiene requisitos diferentes, es posible que deba ajustar el código en consecuencia.

Comments are closed.