it-swarm.dev

Seznam příspěvků podle kategorie pro Non-nula, Non-NULL Vlastní hodnotu pole?

( Moderátoři poznamenávají: Původní název byl následující:

Potřebuji smyčku přes mé kategorie však musím omezit kategorie na ty kategorie, které zahrnují příspěvky, kde vlastní pole price != 0 nebo null.

Jaký je nejlepší způsob, jak to zvládnout?

V současné době mám tohle ...

<div id="page-categories" style="margin-top:-34px;">

<!-- PRINT CATEGORY LISTINGS -->
<?php

$categories=get_categories();
foreach($categories as $category) {
  $myColumnCount = 1;
?>

<h2 style="clear:both;"><a href="<?php bloginfo('url'); ?>/category/<?php
echo($category->slug); ?>"><?php echo($category->name); ?></a></h2>

<?php
query_posts('cat='.$category->cat_ID.
            '&posts_per_page=-1&orderby=title&order=ASC');
?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

<!-- POST DISPLAYING CODE GOES HERE -->

<div id="" class="span-1 <?php if ($myColumnCount==6) { echo "last"; } ?> thumb20" >
    <a class="thumb" href="<?php the_permalink(); ?>" rel="bookmark" title="Link 
to <?php the_title(); ?>" ><?php echo the_post_thumbnail( 'thumbnail' ); ?></a>
</div>
<!-- YOUR POST DISPLAYING CODE GOES HERE -->

<?php if ($myColumnCount == 6) {
    $myColumnCount=0;
} ?>

<?php $myColumnCount = $myColumnCount+1; ?>

<?php
endwhile;
endif;
echo '<hr class="gallery-grid" />';
?>
<?php } ?>

<?php $wp_query = $temp_query; ?>
</div>
1
brian fidler

Ahoj @ Brian Fidler :

Tento problém lze vyřešit několika způsoby. Vybral jsem si jeden, který se může zdát složitější, ale je jednodušší na tematickém kódu, a také sebevědomý a pravděpodobně více výkonný než některé jiné přístupy (jistě více výkonnější než opakování query_posts() pro každou kategorii.)

V podstatě Vytvořil jsem třídu nazvanou PostsByCategoryWithPrice, kde voláte statickou metodu query() pro získání seznamu příspěvků. Má také pomocnou metodu, která se nazývá get_category() k zapouzdření vyhledávání informací o kategorii.

It vrací seznam příspěvků seřazených podle názvu kategorie , takže je můžete procházet smyčkou a echo<h2>{$post_title}</h2> pokaždé, když se kategorie změní. Samozřejmostí je filtrování bez ceny. A používá funkci get_category_link() k odstranění této složitosti z vašeho kódu.

Zde je návod, jak by to mohlo vypadat v jednom z vašich souborů šablon motivů (neměl jsem dostatek správných dat k úplnému testování tohoto kódu, takže počítání sloupců může být trochu vypnuto, ale dotaz jsem otestoval) třída, kterou volá a která by měla být dobrá):

$category = PostsByCategoryWithPrice::get_category(0);
$posts = PostsByCategoryWithPrice::query();
$column=0;
foreach($posts as $post) {
  if ($column++>6)
    $column = 1;
  if ($category->id != $post->category_id) {
    $category = PostsByCategoryWithPrice::get_category($post); ?>
    <h2 style="clear:both;">
      <a href="<?php echo get_category_link($category->id); ?>">
        <?php echo($category->name); ?></a>
    </h2><?php
  }?>
  <div class="span-1 thumb20<?php echo ($count==6 ? ' last' : ''); ?>">
    <a class="thumb" href="<?php the_permalink(); ?>" rel="bookmark" 
       title="Link to <?php the_title(); ?>">
      <?php echo the_post_thumbnail( 'thumbnail' ); ?>
    </a>
  </div><?php
}?>
<hr class="gallery-grid" />

Další je třída PostsByCategoryWithPrice1. Ke změně WP_Query() bylo použito čtyři háčky: jsou to 'posts_fields', 'posts_join', 'posts_where' a 'posts_orderby'. Třída vypadá složitěji, než někteří lidé mohou být obeznámeni, ale ve skutečnosti to není tak složité, je to prostě tam, aby zapouzdřila háčky, takže nemají vliv na žádnou jinou část vašeho webu.

Musel jsem použít všechny háčky a hlavně čtyři (4) spojení, protože zatímco WP_Query() bude dělat taxonomii a meta joins, tak to dělá jen pro to, když jste filtrování taxonomií a pouze když máte přesnou shodu pro meta_value, nikoliv místo, kde je třeba vzít v úvahu NULL (nedávno jsem požádal, aby se něco přidalo do jádra WordPressu, aby bylo možné porovnat porovnání s NULL a bylo řečeno, že to byl dobrý nápad jádra člen týmu, ale ještě tady není.)

class PostsByCategoryWithPrice {
  static $hooks = array();
  private static function Push_action($hook,$callable,$priority=10,$params=1) {
    self::$hooks[$hook] = $callable;
    add_action($hook,$callable,$priority,$params);
  }
  private static function pop_action($count=1) {
    for($i=$count; $i>0; $i--) {
      $hook = end(array_keys(self::$hooks));
      $callable = array_pop(self::$hooks);
      remove_action($hook,$callable);
    }
  }
  static function get_category($post=false) {
    if (!$post)
      $category = (object)array('id'=>false);
    else
      $category = (object)array(
        'id'    => $post->category_id,
        'name'  => $post->category_name,
        'slug'  => $post->category_slug,
        );
    return $category;
  }
  static function query() {
    self::Push_action('posts_fields',array(__CLASS__,'posts_fields'));
    self::Push_action('posts_join',array(__CLASS__,'posts_join'));
    self::Push_action('posts_where',array(__CLASS__,'posts_where'));
    self::Push_action('posts_orderby',array(__CLASS__,'posts_orderby'));
    $query = new WP_Query("posts_per_page=-1");
    self::pop_action(4);
    return $query->posts;
  }
  static function posts_fields($fields) {
    global $wpdb;
    $fields .= ",{$wpdb->terms}.term_id AS category_id,
                 {$wpdb->terms}.name AS category_name,
                 {$wpdb->terms}.slug AS category_slug";
    return $fields;
  }
  static function posts_join($join) {
    global $wpdb;
    $join .=<<<SQL
INNER JOIN {$wpdb->postmeta} 
        ON {$wpdb->postmeta}.post_id={$wpdb->posts}.ID 
       AND {$wpdb->postmeta}.meta_key='price'
INNER JOIN {$wpdb->term_relationships} 
        ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_taxonomy} 
        ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
INNER JOIN {$wpdb->terms} 
        ON {$wpdb->term_taxonomy}.term_id={$wpdb->terms}.term_id
SQL;
    return $join;
  }
  static function posts_where($where) {
    global $wpdb;
    $where .="  AND {$wpdb->term_taxonomy}.taxonomy='category' 
                AND IFNULL({$wpdb->postmeta}.meta_value,'0')!='0' ";
    return $where;
  }
  static function posts_orderby($orderby) {
    global $wpdb;
    $orderby = " {$wpdb->term_taxonomy}.name,
                 {$wpdb->posts}.post_title ASC ";
    return $orderby;
  }
}

Zde je samostatná ukázková verze výše uvedeného kódu , kterou můžete uložit do kořenového adresáře svých webových stránek (jako /test.php možná?). pro váš případ použití. Jakmile se vám to podaří, můžete třídu zkopírovat do souboru functions.php a/nebo do souboru .php pluginu, který vytváříte, a použít kód šablony ve svém motivu v "Šabloně stránky" (nebo soubor šablony vlastního typu příspěvku), kde chcete zobrazit tyto miniatury příspěvků.

Můžete si jej stáhnout z Gistu :

2
MikeSchinkel

Nepoužívejte k tomu query_posts(). Pro sekundární smyčky vždy použijte get_posts() nebo WP_Query.

Zkuste něco takového:

$categories = get_categories();

foreach ( $categories as $category ) {

    $posts = get_posts( array(
    'cat' => $category->cat_ID,
    'posts_per_page' => '-1',
    'orderby' => 'title',
    'order' => 'ASC',
    'meta_key' => 'price',
    'meta_compare' => '>',
    'meta_value' => '0'
    ) );


    if( !count( $posts ) )
         continue;

    // else we have some posts in this category
}
1
Rarst