Pregunta sobre Developing with WordPress de Wordpress:

Necesita ayuda para eliminar resultados duplicados de un bucle foreach

Un usuario preguntó 👇

Quiero agregar contenido de la barra lateral a mi página de resultados de búsqueda de WordPress que muestre las categorías y etiquetas principales, que están relacionadas con la consulta de búsqueda actual. Logré generar el contenido, pero también hay una gran cantidad de duplicados en exhibición. Haga clic para ver mi página de muestra.

He probado dos formas de hacer esto, sin éxito. Ambos se extrajeron de hilos anteriores con preguntas similares. Prefiero evitar los plugins de terceros si es posible. Cualquier idea será muy apreciada. Gracias

Intente primero:

function list_search_cats() {
  // Start the Loop
  $uniqueCats = array();
  while ( have_posts() ) : the_post();

    $cats = get_the_category();

    if (! in_array($cats, $uniqueCats)) :
      $uniqueCats[] = $cats;
      foreach($cats as $cat) :
        echo '<li><a class="tag" href="'.get_category_link($cat->cat_ID).'">' . $cat->cat_name . '</a></li>';
      endforeach;
    endif;

  endwhile;

}

Segundo intento:

function list_search_cats() {
  // Start the Loop
  $uniqueCats = array();
  while ( have_posts() ) : the_post();

    $cats = get_the_category();
    $cats = array_unique($cats, SORT_REGULAR);

    foreach($cats as $cat) :
      echo '<li><a class="tag" href="'.get_category_link($cat->cat_ID).'">' . $cat->cat_name . '</a></li>';
    endforeach;

  endwhile;

}

(@eltobiano)

hace 1 año

Hola @ jeffsydor-bipc, entonces parece que arruinas las cosas con un bucle anidado. Tomemos su primer intento como ejemplo y trabajemos en él:

function list_search_cats() {
  // First we set the empty array for unique categories in local scope
  $uniqueCats = array();
  // Then we loop through search results 
  while ( have_posts() ) : the_post();

    $cats = get_the_category();

    if (! in_array($cats, $uniqueCats)) :
      $uniqueCats[] = $cats;
    endif;
  endwhile;
  //Then when the loop is finished we loop through the unique cats array.
  foreach($uniqueCats as $cat) :
        echo '<li><a class="tag" href="'.get_category_link($cat->cat_ID).'">' . $cat->cat_name . '</a></li>';
  endforeach;
}

No he probado este código, es posible que necesite algunos ajustes, pero puede hacerse una idea. Su foreach se ha ejecutado varias veces, por lo que encontró categorías duplicadas en la salida.

Espero que esto ayude. ¡Cuídate!

Esta respuesta fue modificada hace 1 año por.

(@ jeffsydor-bipc)

hace 1 año

Hmm La variable $ cat parece no ser reconocida después.

Recibo los siguientes errores: Intentando obtener la propiedad ‘cat_ID’ que no es del objeto … línea 114 Intentando obtener la propiedad ‘cat_name’ que no es del objeto … línea 114

Esa línea es el eco:
echo '<li><a class="tag" href="'.get_category_link($cat->cat_ID).'">' . $cat->cat_name . '</a></li>';

(@ jeffsydor-bipc)

hace 1 año

Así que probablemente estoy lejos de esto, pero esto es lo que intenté hacer. Me di cuenta de que primero podía crear la matriz $ uniqueCats vacía, iniciar el ciclo para crear la cadena para cada elemento de la lista y almacenar esa cadena en la matriz vacía si aún no existía.

Luego agregaría un nuevo conjunto de cadenas y generaría cada uno como un artículo único. Por supuesto, esto no funcionó, pero no estoy seguro de si valió la pena compartirlo o no.

function list_search_cats() {
  // Start the Loop
  $uniqueCats = array();
  while ( have_posts() ) : the_post();
  
    $cats = get_the_category();
  
    foreach($cats as $cat) :
      $catLink = get_category_link($cat->cat_ID);
      $catName = $cat->cat_name;
      $newCat = '<li><a class="tag" href="'. $catLink .'">' . $catName . '</a></li>';
      
      if (!in_array($newCat, $uniqueCats)) : array_push($uniqueCats, $newCat);
      endif;
    endforeach;
  
    foreach($uniqueCats as $uniqueCat) :
      echo $uniqueCat;
    endforeach;
  
  endwhile;
}

(@ jeffsydor-bipc)

hace 1 año

No sé si esto ayuda o no, pero después de más retoques, mi matriz parece ser una matriz con muchas matrices adentro. ¿Es esta la razón de la duplicación? ¿Se pueden extraer estas matrices en la matriz raíz?

(@bcworkz)

hace 1 año

Sus intentos iniciales tienen duplicados porque tiene un ciclo anidado sin mecanismo para eliminar duplicados. get get_the_category () retrocede los objetos de término. Jjberry tuvo la idea correcta de no usar in_array () para buscar duplicados. Sin embargo, in_array () no funciona bien para detectar objetos duplicados. Para ser justos, jjberry dijo que su código necesitaba ser ajustado 🙂

El último intento es mucho mejor ya que obtuvo los datos relevantes para usar en not in_array (), pero implica más procesamiento del necesario. Está construyendo vínculos tanto si se utilizarán como si no. No estoy seguro de dónde está obteniendo la matriz. De todos modos, sugeriría un enfoque ligeramente diferente.

Debe mantener dos matrices de datos únicos para que esto funcione bien. Uno de los ID de categoría de una categoría se utilizará para detectar duplicados que no son in_array (), y el segundo de los objetos de término únicos pasó la prueba non-in_array (). O envíe el término enlaces directamente en lugar de mantener un conjunto de cosas si eso funciona en el contexto de su código. Todavía sigo ordenando de todos modos, ya que podemos ordenar los términos del objeto antes de comenzar la salida.

Entonces, en otras palabras, inicie dos matrices vacías primero.

Encuentra sus categorías para cada publicación. Obtienes un conjunto de cosas de término.

Para cada término, elimine su ID y verifique si está en un rango de ID único. La primera a través de la matriz está vacía, por lo que pasa la prueba que no es de matriz ().

Si pasa la prueba non-in_array (), agregue el término de ID actual a la matriz de ID única y también agregue el objeto de término completo a la otra matriz.

Enjuague y repita hasta que se procesen todas las publicaciones y términos de categorías posteriores.

Ya no necesita la matriz de identidad única ahora, tiene un conjunto de cada término único. Puede ordenar este conjunto si desea utilizar usort ().

Muestra cada término en la matriz única de enlaces.

(@diondesigns)

hace 1 año

Suponiendo que la lógica básica de su función sea correcta, lo siguiente debería hacer lo que desee. Utiliza una matriz temporal para almacenar los ID recibidos, y esa matriz se verifica para ver si se debe generar el enlace HTML. Esto será en orden de tamaño (si no más grande) más rápido que usarlo in_array() ya que necesita verificar si hay una clave de matriz. El código no ha sido probado.

function list_search_cats() {
	$catTmp = array();
	$catLinks = '';

	while (have_posts()) {
		the_post();
		$cats = get_the_category();

		foreach ($cats as $cat) {
			$catID = $cat->cat_ID;

			if (empty($catTmp[$catID])) {
				$catTmp[$catID] = 1;
				$catLinks .= '<li><a class="tag" href="' . get_category_link($catID) . '">' . $cat->cat_name . '</a></li>';
			}
		}
	}

	echo $catLinks;
}

(@ jeffsydor-bipc)

Hace 12 meses

@diondesigns ¡gracias! ¡Esto funcionó perfectamente!

Ahora creo que necesito encontrar una manera de ordenarlos por número de incidentes. ¡Pero ahora tengo que entender por qué el tuyo funciona!

¡Gracias!

(@ jeffsydor-bipc)

Hace 11 meses, 4 semanas

@diondesigns También intenté personalizar esto para mis etiquetas. Pero por alguna razón no funciona aquí. ¿Algunas ideas?

function list_search_tags() {
   $tagTmp = array();
   $tagLinks = '';
  
   // Start The Loop
      while (have_posts()) : the_post();
         $post_tags = get_the_tags();

         foreach ($post_tags as $tag) : $tagID = $tag->term_id;

            if (empty($tagTmp[$tagID])) :
               $tagTmp[$tagID] = 1;
               $tagURL = get_tag_link($tagID);
               $tagName = $tag->name;
               $tagLinks .= '<li><a class="tag" href="' . $tagURL . '">' . $tagName . '</a></li>';
            endif;
  
      endforeach;
   endwhile;

   echo $tagLinks;
  
}

(@ jeffsydor-bipc)

Hace 11 meses, 4 semanas

¡No, no importa! Me di cuenta de que las publicaciones no estaban etiquetadas. Tonto para mí. jajaja

¿Solucionó tu problema??

0 / 0

Deja una respuesta 0

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *