Skip Navigation

[Cerrado] Votaciones de podcasts

Este es el foro de soporte técnico para Toolset: un paquete de plugines para el desarrollo de sitios WordPress sin escribir PHP.

Cualquier persona puede leerlo, pero solo los clientes de Toolset pueden publicar en este foro. El soporte de Toolset atiende 6 días a la semana, 19 horas por día.

Etiquetado: 

This topic contains 7 respuestas, has 2 mensajes.

Last updated by Nigel hace 2 meses, 1 semana.

Assigned support staff: Nigel.

Autor
Mensajes
#2041197

Tell us what you are trying to do?
Hola.
En la asociación tenemos una web con usuarios registrados en dos categorías:
* Socios (pagan una cuota)
* Simpatizantes (no pagan cuota)

Sólo los dos tipos de usuarios pueden y tienen registrados uno o más podcasts. Estos podcasts están registrados en un tipo de entrada hecho con Toolset con diferentes campos personalizados llamado Podcast que contienen campos personalizados tipo portada del podcast, integrantes, descripción del podcast... y dos grupos de taxonomías (países y categoría del podcast).

Hemos hecho unos formularios donde solo los socios y simpatizantes pueden registrar y modificar sus podcast.

Hemos creado un directorio donde todo el mundo puede ver, buscar o filtrar los podcasts de nuestros socios y simpatizantes.

Ahora lo que queremos hacer es que los socios y simpatizantes puedan votar aquellos podcasts que más les gusten con las siguientes condiciones:

* Cada socio o simpatizante tiene que permitir que su podcast participe en los premios (esto en principio creemos que se soluciona con un campo personalizado tipo check).

Una vez inscritos y visto que todo está bien, pasaríamos a:
* 1ª fase donde pueden votar todos los socios y simpatizantes.
* 2ª fase donde sólo los socios pueden votar para realizar desempate.

Habíamos pensado en crear una plantilla para que mostrase un listado organizado por la taxonomía Categoría con los podcasts que se presentan a los premios y a partir de ahí, los socios o simpatizantes pudiesen votar a sus podcasts favoritos.

No sabemos si con Toolset se podría hacer todo esto que comentamos. ¿Nos podríais ayudar a cómo construir este sistema de votación? ¿Quizás necesitaríamos otras herramientas/plugins para realizar esto? Hay que tener en cuenta que cada año se harán votaciones y nos gustaría un sistema que pudiésemos aprovechar para votaciones posteriores y así tener un registro de qué votaron los socios y simpatizantes en años anteriores.

Muchas gracias por vuestra ayuda.

What is the link to your site?
Ahora mismo estamos haciendo pruebas en el entorno de desarrollo:
hidden link

#2042383

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+01:00)

Buenos días

Lo que quieres es bastante complicado, tengo que pensar en lo que es posible.

Vuelvo contestar pronto.

#2044797

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+01:00)

Sea difícil, de verdad.

Me hace falta unos clarificaciones.

1. ¿en cada fase un usuario puede votar tantos veces que quiere ó solo tiene un voto?
2. ¿cada año los podcasts en que los usuarios votan son distintos ó no? Es decir, si podcast A está incluido en el concurso de 2021 ¿puede ser que aparece en un concurso de un año siguiente?

#2044993

Hola, Nigel.
Respondo a las preguntas:
1. No, no debería poder votar tantas veces como quiera: sólo un voto, pero a tantos podcasts como quiera.
2. Buena pregunta. Los podcasts normalmente no se borran, ya que aunque no se sigan emitiendo los seguimos teniendo en el directorio. Eso sí, desde la asociación haríamos que cada podcaster se tuviese que volver a permitir que su podcast participe en los premios (esto en principio creemos que se soluciona con un campo personalizado tipo check). Si hace falta, desde el panel de administración quitaríamos todos los checks a todos los podcasts antes de convocar de nuevo los premios en otro año.

No sé si esto te aclara algo.

Somos conscientes del esfuerzo que estáis realizando para ayudarnos, ya que no es un caso fácil, por lo que os lo agradecemos mucho de antemano.

Un saludo.

#2046373

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+01:00)

He preparado una muestra sencilla que funciona en una forma básica (aunque necesita código particular), pero lo difícil es el concepto de repetir el concurso cada año.

Me parece que la mejor forma es usar relaciones, con tipos de entrada para el voto, el año, conectado a la entrada del podcast, pero encuentro algunos limitaciones en que se permite y sigo buscar alternativos.

Tengo un idea, pero tendrá que hacer más pruebas para si saldrá bien.

Te contesto de nuevo...

#2051961

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+01:00)

votar.png
content selection.png
Screenshot 2021-05-11 at 15.01.52.png

He preparado una muestra de los conceptos básicos que puedes ver online.

Puedes acceder como administrador al back end aquí: hidden link

La implementación refleja unas limitaciones que impeden el uso de relaciones muchos-a-muchos, p.j.

Incluso esta versión simple necesita código particular y el uso del editor clásico de Views a la vez con el editor actual de Blocks, y una implementación más completa hará falta más código particular.

Entonces, usamos los tipos de entrada siguientes, connectado por relaciones uno-a-mucho (pantallazo).

Podcasts.
Año (el año en que el podcast participa en el concurso).
Voto (un voto por un usuario para un podcast en un año concreto).
Participación (effectivamente el pegamento que conecta lo demás).

Una entrada participación conecta un podcast con un año (p.j. "Cómo crear sitios de web con Toolset" con "2021"). Esta conexión significa que un podcast participa en el concurso en este año.

Los usuarios no votan para un podcast directamente, votan para tales participaciones, así el mismo podcast puede participar en el año 2021, en el 2022, no en el 2023, sí en el 2024 etc.

Puedes ir a Toolset > Relationships a ver las relaciones establecidas.

La primera tarea es marcar podcasts como participantes en un año.

Usamos un formulario ("Incluir podcast") para publicar entradas de participación con el podcast y el año conectado, y usamos un View de podcasts para mostrar este formulario y establecer en el formulario el valor del campo del relación de podcast. Puedes ver detalles en la página "Incluir podcast".

En este ejemplo cualquier usuario puede marcar un podcast para participación (como si fuera administrador), pero podrías añadir un filtro de consulta para el autor para que los usuarios solo ven sus propios podcasts. Necesita código particular para evitar que un podcast puede participar más que una vez en el mismo año.

Ya hay unos podcasts marcado como participantes en el 2021.

Los usuarios pueden votar en la página Votar 2021.

Si un usuario ya ha votado para un podcast verá un enlace para anular su voto. Puede votar para lo demás podcasts.

Este página usa un View con dos columnas. Se parece que ofrecemos una lista de podcasts, pero el contenido del View es de participaciones, con un filtro de consulta para mostrar solo participaciones del año 2021 (pantallazo). En la salida del View, en la columna izquierda sale el título del podcast y no de la entrada participación porque seleccionamos el podcast relacionado como fuente.

En la columna derecha queremos mostrar el formulario de votación ó un enlace para anular el voto si ya han votado. Usamos un View que consulta votos y tiene filtros de consulta para buscar votos relacionado a la participación corriente por el usuario corriente (pantallazo). En la salida si encontramos entradas significa que el usuario ya ha votado para este podcast participación y entonces mostramos el enlace de anular el voto. Si no encontramos resultados significa que no ha votado y mostramos el formulario de votar.

Como de momento no hay soporte para Views anidados en el editor de Blocks es necesario usar el editor clásico para crear este View (ve Toolset > Views > Votar).

Así los usuarios pueden incluir sus podcasts en los concursos, y votar.

En la página "2021 resultados" mostramos los votos.

Usamos otro View. Recuerde que no votan para los podcasts, votan para las participaciones de un podcast en un año, entonces este View consulta las participaciones con filtro de consulta para solo mostrar participaciones en el año 2021. En la salida cambiamos fuente para publicar el título del padre podcast en lugar de la participación.

Para publicar los votos es necesario usar un shortcode particular, "connections". He añadido el código en el archivo functions.php de la tema, para lo incluyo abajo.

También necesitamos código particular para ordenar los resultados por los votos, y este código encontrarás en el archivo functions.php también.

Verás en el sitio de prueba que hay unos usuarios registrados que son autores de los podcasts etc., y si quieries logear como cualquiera las contraseñas son iguales: toolsetsupport.

Como ves, es bastante complicado, y hasta ahora no he pensado en las dos fases p.j.

Te sugiero que se familiarice con lo que hice y dime lo que piensas...

/**
 * Register custom shortcode 'connections'
 */
add_shortcode( 'connections', function( $atts = [] ){
  
    // provide defaults
    $atts = shortcode_atts( 
        array(
            'relationship'      =>   '',
        ), 
        $atts
    );
  
    global $post;
    $count = 0;
  
    $relationship = toolset_get_relationship( $atts['relationship'] );
  
    if ( $relationship ) {
  
        $parent = $relationship['roles']['parent']['types'][0];
        $child = $relationship['roles']['child']['types'][0];
        $type = $post->post_type;
  
        $origin = ( $parent == $type ) ? 'parent' : 'child';
  
        // Get connected posts
        $connections = toolset_get_related_posts( $post->ID, $atts['relationship'], array(
        	'query_by_role' => $origin,
        	'role_to_return' => 'other',
        	'need_found_rows' => true )
    	);
    	$count = $connections['found_rows'];
  
    }
  
    return $count;
});


/*
 * Order parent posts by child post count
 */
function tssupp_filter_query($view_args, $view_settings, $view_id) {
 
    // Edit slugs
    $parent_slug = 'participacion';
    $child_slug = 'voto';
    $relationship_slug = 'participacion-voto';
 
    if (in_array($view_id, array( 55 ))) { // Edit View ID
 
        $parents = get_posts(array(
            'post_type' => $parent_slug,
            'nopaging' => true,
            'post_status' => 'publish',
            'tax_query' => $view_args['tax_query'],
        ));
 
        if (count($parents) > 0) {
 
            foreach ($parents as $parent) {
 
                $children = toolset_get_related_posts($parent->ID, $relationship_slug, array('query_by_role' => 'parent', 'role_to_return' => 'child', 'need_found_rows' => true));
                $parent->child_count = $children['found_rows'];
            }
 
            usort($parents, "custom_cmp");
 
            $parent_ids = wp_list_pluck($parents, 'ID');
 
            $view_args['post__in'] = $parent_ids;
            $view_args['post__not_in'] = null;
            $view_args['orderby'] = 'post__in';
        }
    }
    return $view_args;
}
add_filter('wpv_filter_query', 'tssupp_filter_query', 101, 3);
 
function custom_cmp($a, $b) {
    if ($a->child_count == $b->child_count) {
        return 0;
    }
    return ($a->child_count > $b->child_count) ? -1 : 1;
}
#2059235

Hola Nigel.
Muchas gracias por tu respuesta, que aunque no hayamos dicho nada (muy mal por nuestra parte), estamos trabajando en la solución que has propuesto, la cual nos parece muy ingeniosa.

Por favor, pedimos mantener un poco más el sandbox o WordPress que has hecho, para que podamos utilizar como ejemplo.

Muchas gracias.
Saludos.

#2059315

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+01:00)

Este sitio se anula después de 7 días de inactividad, entonces para poder seguir acceder es solo necesario iniciar sesión cada pocos días...

El debate ‘[Cerrado] Votaciones de podcasts’ está cerrado y no admite más respuestas.