it-swarm.dev

Podmíněně dotaz Vlastní typy příspěvků podle Post Meta pro domovskou stránku blogu?

( Poznámka moderátora: Původní název otázky byl: "Vlastní dotaz: Zobrazit vlastní typy příspěvků a vlastní typ příspěvku s metadatou příspěvku na domovské stránce blogu" )

Potřebuji pomoc s vlastním dotazem. Mám tři vlastní typy příspěvků:"Novinky","Události","Příběhy". Na hlavní stránce blogu se zobrazí pouze Zprávy a události. Klient se může rozhodnout označit StoryasNews pomocí funkcí pluginu Meta boxy Verve . Pokud má příspěvek Příspěvky meta klíč 'mark-as-news', pak by se tento příspěvek měl zobrazit také na hlavní stránce blogu.

Takže co potřebuji pomoc s psaním je toto:

Pokud má Příběh příspěvek meta 'mark-as-news', hlavní stránka blogu bude zobrazovat vlastní typy příspěvků Zprávy a události a příběhy v sestupném pořadí.

Může někdo pomoci?

Dík!

Upravit:

Snad lepší způsob formulace by to byl ?:

Zobrazit vlastní typy příspěvků Zprávy a události, a pokud existuje klíč 'mark-as-news' pro post_meta, zobrazit Příběhy.

2
webcodeslinger

Dobrý den @ webcodeslinger:

Zde je základní dotaz MySQL pro načítání zpráv a událostí (což je podstatně zjednodušeno od toho, co WordPress vlastně dělá):

SELECT * FROM wp_posts WHERE post_type IN ('news','events') 

To, co chcete, je něco takového (v MySQL existuje více výkonných způsobů, ale ve WordPressu jsou složitější a pro většinu stránek nikdy nezaznamenáte rozdíl):

SELECT * FROM wp_posts WHERE post_type IN ('news','events') 
  OR (post_type='stories' AND ID IN 
    (SELECT post_id FROM wp_postmeta WHERE meta_key='mark-as-news')
  )

Takže ... přidat, že extra SQL dotazu vaší hlavní smyčky použít háček 'posts_where'. Do souboru functions.php můžete zadat následující kód zavěšení (v dolní části souboru bude dělat) nebo v jednom ze souborů .php pluginu, pokud vytváříte plugin :

add_action('posts_where','yoursite_posts_where',10,2);
function yoursite_posts_where($where,$query) {
  global $wp_the_query;
  if (is_home() && $query===$wp_the_query) { // This means home page and the main loop
    global $wpdb;
    $where .= " OR ({$wpdb->posts}.post_type='actor' AND " . 
              "{$wpdb->posts}.ID IN (" . 
                "SELECT post_id FROM {$wpdb->postmeta} " .
                "WHERE meta_key='mark-as-news')) ";
  }
  return $where;
}
2
MikeSchinkel

To, co chcete, je snadné popsat, ale je těžké pracovat s WP API. Zatím jsem neviděl pěkné a uklizené řešení.

V podstatě WP dotaz je efektní wrapper pro dotaz SQL, který získává řádky příspěvků z databáze. Co chcete, jsou prakticky dva různé dotazy pro dvě různé sady příspěvků. WP aktuálně nezpracovává takové NEBO logiku v dotazech.

Můžete provést dva dotazy a kombinovat výsledky, ale v takovém případě bude těžké získat právo na stránkování.

Toto je pravděpodobně jeden z důvodu časopisu-témata témata stala se populární, protože oni se specializují na ukazovat rozmanité soubory pracovních míst v několika oblastech, spíše než bojovat s komplexním mixem obsahu.

0
Rarst