Obtener solo términos que están en uso

18 mar 2024, 18:39:15
Vistas: 59
Votos: 1

Actualmente estoy usando term_exists( $term, $taxonomy ); en un condicional, pero el problema es que incluye términos que no están siendo utilizados (aunque existen en la lista de categorías).

¿Existe algo que pueda usar además de term_exists que incluya categorías solo si están en uso? ¿O necesito filtrar de alguna manera para obtener los términos en uso?

Estoy filtrando un archivo de propiedades inmobiliarias a través de un elemento select. Cada semana, cuando se designan casas abiertas, aplico la categoría 'Open House' a ellas, permitiendo a los visitantes filtrar para ver todas las casas abiertas. Después del fin de semana, elimino la categoría de casa abierta de cada listado. Ejemplo: https://megangulick.com/agent-listings/ (actualmente solo edito la opción manualmente, por lo que 'Open House' no aparece como opción).

Lo que quiero hacer es cambiar la opción inicial del select basado en si hay o no casas abiertas actualmente designadas.

Así es como se ve mi código actual:

<?php $categories = get_categories('taxonomy=listing-neighborhood&post_type=listings'); ?>
<select name="listingcat" id="listingcat" onchange="submit()">
<?php //este es el fragmento para el que necesito una solución
$cat = (term_exists('Open House', $categories));
if $cat {
    echo '<option value="">Seleccionar vecindario o casa abierta</option>';
} else { 
    echo '<option value="">Seleccionar vecindario</option>';
}
?>
<?php 
    foreach ($categories as $category) : 
    echo '<option value="'.$category->name.'"';
    if(isset($_GET['listingcat']) && ($_GET['listingcat'] == $category->name)) { 
        echo ' selected="selected"'; 
    } 
    echo '>'.$category->name.'</option>';
    endforeach; 
?>
</select>

La tarea aquí es cómo determinar si un término particular (por ejemplo, Open House) está en uso, luego usar esa información para una declaración condicional if/else.

6
Comentarios

¿Has probado a añadir &hide_empty=1 en tu cadena de consulta?

birgire birgire
19 mar 2024 17:10:34

¿Es esto lo que quieres decir?
<?php $categories = get_categories('taxonomy=listing-category&post_type=listings&hide_empty=1'); ?> No tiene ningún efecto.

Ray Gulick Ray Gulick
19 mar 2024 17:24:09

Debería ocultar los vacíos por defecto, supongo que estoy malinterpretando la configuración y la pregunta.

birgire birgire
19 mar 2024 18:03:08

El menú desplegable muestra los términos perfectamente, incluyendo solo aquellos que están en uso. Lo que estoy tratando de hacer es mostrar una primera opción diferente dependiendo de si 'Open House' está en uso. Sospecho que 'term exists' es la función incorrecta para usar, ya que obtiene todos los términos, estén en uso o no. SI 'Open House' está entre los términos activos ENTONCES MOSTRAR <option value="">Seleccionar barrio u open house</option> DE LO CONTRARIO MOSTRAR <option value="">Seleccionar barrio</option>

Ray Gulick Ray Gulick
19 mar 2024 21:29:45

Si estás intentando determinar si una publicación dada tiene un término específico, puedes usar has_term() -- algo como has_term( 'Open House', 'listing-category', get_the_ID() ) podría ser lo que necesitas en lugar de tu llamada a term_exists().

Pat J Pat J
20 mar 2024 02:48:29

No estoy intentando determinar si una publicación específica tiene el término, sino si ALGUNA publicación tiene un término dado. Probé has_term; no funciona. Sospecho que necesito un condicional in_array.

Ray Gulick Ray Gulick
20 mar 2024 11:40:30
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 2
0

Empecé a investigar sobre arrays de términos y se me ocurrió algo que funciona, la solución para crear un condicional basado en si un término está en uso por algún post o no:

<?php $categories = get_categories('taxonomy=listing-neighborhood&post_type=listings'); ?>
<?php 
    $term_name = wp_list_pluck( $categories, 'name' );
    $this_name= 'Casa Abierta'; // Traducido "Open House" a español
    if( in_array( $this_name, $term_name ) ){
        echo '<option value="">Seleccionar estado o casa abierta</option>';
    } else { 
        echo '<option value="">Seleccionar estado (mostrar todos por defecto)</option>';
    }
?>

Agradezco la ayuda de todos. Creo que mi pregunta inicial fue engañosa, no era la pregunta que necesitaba hacer para encontrar la solución.

20 mar 2024 13:31:05
2
-1

Para recuperar solo los términos que están en uso en publicaciones asociadas, puedes usar la función get_terms() con el parámetro pad_counts establecido en verdadero. Esto asegurará que la propiedad count de cada objeto término refleje el número de publicaciones asociadas. Luego puedes filtrar los términos con un conteo de 0

$taxonomy = 'tu_taxonomia'; // Reemplaza 'tu_taxonomia' con el nombre de tu taxonomía
$terms = get_terms(array(
    'taxonomy' => $taxonomy,
    'pad_counts' => true, // Establecer en true para incluir el conteo de publicaciones asociadas
));

// Filtrar términos para incluir solo aquellos con publicaciones asociadas
$used_terms = array_filter($terms, function($term) {
    return $term->count > 0;
});

// Verificar si se recuperaron términos
if (!empty($used_terms)) {
    foreach ($used_terms as $term) {
        // Mostrar información del término
        echo '<p>Nombre del término: ' . $term->name . '</p>';
        echo '<p>ID del término: ' . $term->term_id . '</p>';
        echo '<p>Slug del término: ' . $term->slug . '</p>';
        echo '<p>Descripción del término: ' . $term->description . '</p>';
        echo '<p>Conteo de publicaciones: ' . $term->count . '</p>';
        // Puedes mostrar más información sobre el término si es necesario
    }
} else {
    echo 'No se encontraron términos con publicaciones asociadas.';
}
19 mar 2024 05:18:26
Comentarios

Eso va a requerir una reescritura más grande de lo que esperaba, pero parece prometedor. Volveré con resultados más tarde esta mañana. Gracias.

Ray Gulick Ray Gulick
19 mar 2024 10:46:29

Esto realmente no funciona en mi instancia (agregando mi código existente e información adicional en mi pregunta original).

Ray Gulick Ray Gulick
19 mar 2024 14:00:27