Skip Navigation

[Resolved] Anuncios aleatorios en la view de posts

This support ticket is created 6 years, 10 months ago. There's a good chance that you are reading advice that it now obsolete.

This is the technical support forum for Toolset - a suite of plugins for developing WordPress sites without writing PHP.

Everyone can read this forum, but only Toolset clients can post in it. Toolset support works 6 days per week, 19 hours per day.

Sun Mon Tue Wed Thu Fri Sat
- 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 -
- 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 -

Supporter timezone: Europe/London (GMT+00:00)

This topic contains 13 replies, has 2 voices.

Last updated by nandomerino 6 years, 8 months ago.

Assisted by: Nigel.

Author
Posts
#612267

He creado una view que muestra los últimos posts de un par de categorías, necesito incluir anuncios diferentes entre post y post, estos anuncios los tengo creado con un CPT y los introduzco en el bucle para que se muestren, el problema es que el bucle se repite por cada post y necesito que cada post muestre anuncios diferentes, adjunto captura para que se entienda el problema actual.

Espero tus comentarios que me guíen por el camino correcto.

#612670

Nigel
Supporter

Languages: English (English ) Spanish (Español )

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

Hola Fernando

No veo ninguna captura, pero si quieres que salen entrada, anuncio, entrada, anuncio, entrada, anuncio (los anuncios en orden aleatorios) se hace con dos Views.

El primero es para mostrar las entradas, como quieres.

En en bucle de este View se mete un segundo View (con el shortcode wpv-view insertado con el botón Campos y Vistas), para mostrar anuncios.

Este View muestre el tipo de entrada de los anuncios, tiene un limite de 1, tiene orden aleatorio. El bucle contiene lo que quieres aparecer del anuncio.

Un anuncio saldrá con cada entrada, pero distintos anuncios cada vez. (Suele pasar que un anuncio se repite por coincidencia. No hay manera sencilla de evitar este.)

#612705

Buenas Nigel;
He probado tu respuesta y funciona tal y como dices, pero no hay forma de controlar el orden en que se muestran los anuncios y que no se repitan¿?

Gracias.

#612936

Nigel
Supporter

Languages: English (English ) Spanish (Español )

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

Screen Shot 2018-02-05 at 16.21.34.png
Screen Shot 2018-02-05 at 16.24.43.png

Hola Fernando.

"no hay forma de controlar el orden en que se muestran los anuncios" - si tienen orden aleotorio, pues no.

Con este solución hay una consulta de base de datos principal que coge las entradas (todo a la vez) y entre las salidas de las entradas hay otra consulta (cada vez) que coge aleatoriamente un anuncio. De este manera no se sabe cuales ya han sacado por que todas son consultas nuevas.

Me parece que el único solución es una sola consulta que coge entradas y anuncios a la vez, que, anteriormente se manipula con código para cambiar el orden a entrada, anuncio, entrada, anuncio etc.

Puedes usar el filtro wpv_filter_query_post_process para este: https://toolset.com/documentation/programmer-reference/views-filters/#wpv_filter_query_post_process

Tendrás que decidir como ordenar los anuncios. Podrías usar un campo de entrada, o el opción "Orden de menu". Es necesario habilitar este en el configuración de tipos de entrada (ve pantallazo).

#622563

Buenas Nigel;

No entiendo muy bien como aplicar esta solución que me comentas, puedes explicarme un poco más?¿

#622632

Nigel
Supporter

Languages: English (English ) Spanish (Español )

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

Hola Fernando

Pues, te explico con una muestra de código:

function tssupp_customise_view_results( $query, $views_settings, $view_id ){

	if ( 12 == $view_id ) { // Edit view id

		$results = $query->posts;
		$type1 = array();
		$type2 = array();

		// Split the results into two arrays, one for each post type
		foreach ($results as $key => $result) {

			if ( $result->post_type == 'type1' ) { // edit post type slug
				$type1[] = $result;
			}
			if ( $result->post_type == 'type2' ) { // edit post type slug
				$type2[] = $result;
			}
		}

		// Shuffle the results
		$shuffled = array();

		foreach ( $type1 as $key => $value ){
		  $shuffled[] = $value;
		  $shuffled[] = $type2[$key];
		}

		$query->posts = $shuffled;

	}

	return $query;	
}
add_filter( 'wpv_filter_query_post_process', 'tssupp_customise_view_results', 10, 3);

(No lo he probado, pero creo que funcionará ? )

Si el View muestra las entradas y los anuncios a la vez, este código divide los resultados en entradas y en anuncios y entonces mezcla los uno por uno.

Se supone que hay tantos anuncios que entradas.

#623363

Gracias por la explicación (y el código casi resuelto) voy a implementarlo y te cuento si tengo algún problema. Muchas gracias de nuevo!

#623400
Captura de pantalla 2018-03-08 a las 17.38.29.png

Buenas de nuevo;

Algo estoy haciendo mal, he editado y añadido al functions.php (se añade aquí no¿?) tu código con los datos de mi sitio web y cuando cargo la web esta aparece en blanco (adjunto captura), copio aquí el código por si vieras donde puedo estar fallando:

function tssupp_customise_view_results( $query, $views_settings, $view_id ){

if ( 11835 == $view_id ) { // Edit view id

$results = $query->posts;
$type1 = array();
$type2 = array();

// Split the results into two arrays, one for each post type
foreach ($results as $key => $result) {

if ( $result->post_type == 'post' ) { // edit post type slug
$type1[] = $result;
}
if ( $result->post_type == 'anuncio-home' ) { // edit post type slug
$type2[] = $result;
}
}

// Shuffle the results
$shuffled = array();

foreach ( $type1 as $key => $value ){
$shuffled[] = $value;
$shuffled[] = $type2[$key];
}

$query->posts = $shuffled;

}

return $query;
}
add_filter( 'wpv_filter_query_post_process', 'tssupp_customise_view_results', 10, 3);
#623585

Nigel
Supporter

Languages: English (English ) Spanish (Español )

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

Hola Fernando

El código me parece bien, pero una pantalla blanca indica un error fatal de PHP.

Si aún no lo has hecho, activa el modo debug por editar el archivo wp-config.php y cambia la línea con WP_DEBUG así:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

Eso creará un archivo debug.log en el directorio wp-content que puedes examinar en cualquier editor de texto.

Visita de nuevo la página y entonces inspeccionar el archivo debug.log. Cuéntame lo que dice.

#625545

He encontrado una posible solución, pero para que sea 100% funcional debería poder asignar un ID que siempre sea el mismo que en función de la posición.

Este es el código del loop:

[wpv-layout-start]
	[wpv-items-found]
	<!-- wpv-loop-start -->
	<div class="wpv-loop js-wpv-loop" id="posts-home">
	<wpv-loop wrap="1" pad="true">
		[wpv-item index=1]
		<div class="row posts-home">
			<div class="col-sm-12">[wpv-post-body view_template="Loop item in Posts General Home"]</div>
		</div>
		[wpv-item index=other]
			<div class="col-sm-12">[wpv-post-body view_template="Loop item in Posts General Home"]</div>
		[wpv-item index=pad]
			<div class="col-sm-12"></div>
		[wpv-item index=pad-last]
			<div class="col-sm-12"></div>
		</div>
	</wpv-loop>
	</div>
	<!-- wpv-loop-end -->
[wpv-filter-start hide="false"]
[wpv-filter-controls]<ul class="pagination">
	<li class="page-item">[wpv-pager-prev-page][wpml-string context="wpv-views"]' Anterior[/wpml-string][/wpv-pager-prev-page]</li>
	<li class="page-item">[wpv-pager-next-page][wpml-string context="wpv-views"]Siguiente '[/wpml-string][/wpv-pager-next-page]</li>
</ul>[/wpv-filter-controls]
[wpv-filter-end]
	[/wpv-items-found]
	[wpv-no-items-found]
		<strong>[wpml-string context="wpv-views"]No hay ningún post en esta categoría.[/wpml-string]</strong>
	[/wpv-no-items-found]
[wpv-layout-end]

El código que se muestra dentro del loop es el siguiente:

<div id="[wpv-post-id]" class="fusion-post-content post-content">
<h2 class="blog-shortcode-post-title entry-title"><a href="[wpv-post-url]">[wpv-post-title]</a></h2>
  <div class="fusion-meta-info">
  <div class="fusion-alignleft">
		<span>[wpv-post-date]</span>
    <span class="fusion-inline-sep">|</span>
    [wpv-post-taxonomy type="category"]
    <span class="fusion-inline-sep">|</span>
  </div>
</div>
[wpv-post-featured-image size="full"]
[wpv-post-excerpt length="50" count="word"]
<a class="fusion-read-more" href="[wpv-post-url]">Leer más</a>
</div>

<div class="fusion-clearfix"></div>

Esto muestra 4 posts uno debajo de otro, si hubiera una forma de que el que aparece primero siempre tuviera un ID idéntico, y así con el segundo, tercero y cuarto, podría solucionar esto fácilmente.

#626649

Nigel
Supporter

Languages: English (English ) Spanish (Español )

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

Hola Fernando

Disculpe el retraso en responder, había una fiesta nacional aquí.

No entiendo como este código te ayuda en mezclar anuncios con las entradas.

Este View muestra entradas, ¿no?

¿Dónde están los anuncios?

¿Encontraste el error cuando tenías la página blanca?

#626667

Correcto esta view muestra solo las entradas, pero tengo un código javascript que inserta el anuncio justo después de un post según su ID, por eso me gustaría poder añadir en cada salida del bucle un ID fijo por la posición en la que se muestra.

#626963

Nigel
Supporter

Languages: English (English ) Spanish (Español )

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

¿Algo así:?

<div id='entrada-1'>
  <!-- contenido de la primera entrada -->
</div>
<div id='entrada-2'>
  <!-- contenido de la segunda entrada -->
</div>
<div id='entrada-3'>
  <!-- contenido de la tercera entrada -->
</div>

Ya he preparado un shortcode particular para contar las iteraciones de un View loop que puedes usar.

/**
 * Add loop-iteration shortcode
 * 
 * Attributes
 * 'n' (optional) : test for nth iteration
 */
add_shortcode( 'loop-iteration', function( $atts ){

	global $loop_n;

	if ( !isset( $loop_n ) ) {
		$loop_n = 0;
		return $loop_n;
	}

	$loop_n++;

	if ( !isset( $atts['n'] ) ) {
		// no nth parameter, just return the current index
		return $loop_n;
	}
	else {
		$remainder = ( $loop_n + 1 ) % $atts['n'];
		return ( $remainder == 0 );
	}

});

Se puede usar así:

<div id="entrada-[loop-iteration]">

¿Es lo que buscabas?

#627035

Todo funciona perfectamente gracias a Nigel!