it-swarm-eu.dev

Třídění WordPress příspěvků přes hodnoty uživatelského pole?

Ok, takže používám třídu WPAlchemy k vytvoření vlastních panelů pro zápis do pole v příspěvku pro zápis stránka, a zatím vše, co šlo skvěle ... Nicméně, je tu jeden problém, který nemůžu přijít na to. Snažím se použít vlastní hodnoty pole "data události" k uspořádání událostí na vlastní šablonu stránky.

Postupoval jsem podle pokynů „Dotaz založený na vlastním poli a seřazený podle hodnoty“ nalezený v kodexu, který chcete vyzkoušet a nastavit vlastní dotaz, ale zdá se, že nefunguje?

Zde je kód ze šablony vlastní stránky stránky " Události :

<?php
/* 
  Template Name: Events
*/
get_header();
?>
<div id="depthead" class="grid_12">
  <h2>Upcoming Events</h2>
</div><!--/depthead-->
<?php

$querystr = "
  SELECT wposts.* 
  FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
  WHERE wposts.ID = wpostmeta.post_id 
  AND wpostmeta.meta_key = '_events_meta[event_date]' 
  AND wposts.post_type = 'post'

  ORDER BY wpostmeta.meta_value DESC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);

?>
<?php if ($pageposts): global $post; $cnt=0; foreach ($pageposts as $post): $cnt++; setup_postdata($post); ?>
<div id="article-<?php echo get_the_ID(); ?>" class="listingbox grid_3">
  <div class="deptpostimg">
    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><img src="<?php echo $events_metabox->get_the_value('event_thumbnail'); ?>" style="outline:1px solid #000" alt="<?php the_title_attribute(); ?>" /><span class="event-date"><?php $events_metabox->the_value('event_date'); ?></span></a>
  </div><!--/deptpostimg-->
  <h4 class="listing-titles"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h4>
  <div class="excerpt">
    <?php the_excerpt(); ?>
  </div><!--/excerpt-->
</div><!--/article-<?php echo get_the_ID(); ?>-->
<?php if($cnt % 4 == 0) { ?>
<div class="grid_12 rowseparator">
  <hr />
</div><!--/rowseparator-->
<?php } ?>
<?php endforeach; endif; ?>
</div><!--/wrapper-->
<?php get_footer(); ?>

Je to, jako by to nebylo vyzvednutí vlastních klíčů z pole ... Třída, kterou používám k vytvoření těchto vlastních panelů pro zápis, je ukládá jako pole, a proto jsem se k nim pokusila pomocí: _events_meta[event_date]

Možná je to ten problém, ale nevím, jak to opravit, pokud je ...

Nějaké nápady?


EDIT: Zde je obrázek, takže můžete vidět, jak jsou vlastní pole uložena v databázi. Doufejme, že vám pomůže zjistit, proč na zemi _events_meta[event_date] nebude fungovat v dotazu?

Snímek z PHPMyAdmin s vloženým dotazem pro databázi WordPress http://staticloader.com/phpmyadmin.png

1
Josh

Josh, podívejte se na: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...

Mám na mysli, že změním, jak WPAlchemy ukládá hodnoty ve výchozím nastavení ... takže EXTRACT mode default ...

0
farinspace

Také jsem dostal blog s vlastní pole týkající se události. Zde je dotaz, který jsem použil v kombinaci s funkcí query_posts ():

query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')."&meta_key=event_date_start&orderby=meta_value&order=ASC");

Vybere všechny příspěvky s vlastním polem pojmenovaným event_date a porovná se s aktuálním datem (odfiltruje staré události) a seřadí je podle jiného vlastního pole nazvaného event_start_date. Doufám, že vám komplexní exmaple ukáže, jak správně používat funkci query_posts ().

Jednoduchý výběr, který testuje pouze existenci vlastního pole, vypadá takto:

query_posts('meta_key=event_date'); 

Jednoduchý OBJEDNAT vlastní pole vypadá takto:

query_posts('meta_key=event_date&orderby=meta_value&order=ASC');

Můžete vidět mnoho příkladů v popisu API funkce query_posts () .

2
2ndkauboy

Ahoj @ Josh :

Váš dotaz funguje dobře. Je pravděpodobné, že vaše proměnná $events_metabox není v rozsahu a způsobuje, že váš kód prostě selže (podivně je stále spuštěn zápatí, proč ne.) zkuste jej nastavit na globální v horní části šablony:

global $events_metabox

Pokud to nefunguje, budete muset tento problém sledovat jiným způsobem, protože nevím, co váš kód dělá s $events_metabox.

Ladění pomocí přírůstkových odebrání a print_r()

Když narazíte na problém, jako je tento, začněte odebírat kousky, dokud problém nevyřešíte. Pokud se pokoušíte zjistit, zda váš dotaz funguje nebo ne, použijte příkaz print_r() k výpisu hodnot zabalených v tagech <pre>, abyste viděli, co se děje, tj .:

<?php
$pageposts = $wpdb->get_results($querystr, OBJECT);
echo '<pre>';
print_r($pageposts);
echo '<pre>';

Místo Direct SQL použijte také get_posts()

To znamená, že bych vysoce doporučil nahradit dotaz dotazem get_posts(). Je to nejlepší praxe ve WordPressu na vždy používejte WordPress API a je to dotazovací funkce a nikdy nepoužívejte přímý SQL , pokud to vůbec neexistuje kolem něj. Získáte mnoho výhod, včetně vestavěného ukládání do mezipaměti v některých případech, zvládají věci, jako je například zobrazování pouze publikovaných příspěvků, pokud to neřeknete jinak, a je méně pravděpodobné, že se zlomí, pokud změní strukturu databáze v budoucnosti.

Zde je volání get_posts(), které byste měli nahradit hardcoded SQL dotazem (s některými upozorněními ):

$pageposts = get_posts('meta_key=_events_meta[event_date]&orderby=meta_value&order=ASC');

Nebo tento ekvivalent dělá totéž:

$pageposts = get_posts(array(
  'meta_key' => '_events_meta[event_date]',
  'orderby'  => 'meta_value',
  'order'    => 'ASC',
));

Varování Zmínil jsem se o tom, že váš dotaz nevyfiltroval nevydané, koncepty atd .; můj odhad je to, co get_posts() dělá to vlastně víc, co chcete stejně.

Kodexové dokumenty pro get_posts()

Dokumentace get_posts() je zde:

Ale zajímavě je lepší dokumentace pro get_posts() argumenty na stránce query_posts(), kterou můžete také pravděpodobně použít pro vaše potřeby. Dávám přednost větší kontrole get_posts() ale YMMV .

query_posts() vlastně jen volání get_posts(), takže argumenty jsou skutečně totožné:

0
MikeSchinkel