it-swarm-pt.tech

Classificando Posts WordPress via valores de campo personalizados?

Ok, estou usando a classe WPAlchemy para criar painéis de gravação de campo personalizados no post de gravação página, e até agora tudo foi ótimo ... No entanto, há um problema que não consigo descobrir. Eu estou tentando usar os valores de campo personalizado de "datas do evento" para classificar eventos em um modelo de página personalizado.

Eu segui as instruções "Consulta baseada no campo personalizado e classificada por valor" encontrada no códice para tentar configurar a consulta personalizada, mas não parece estar funcionando?

Aqui está o código do modelo de página personalizado para a página " Events ":

<?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(); ?>

É como se não estivesse pegando as chaves do campo personalizado ... A classe que estou usando para criar esses painéis de gravação personalizados armazena todos como uma matriz, daí a razão pela qual eu tentei acessá-los usando: _events_meta[event_date]

Talvez seja esse o problema, mas não sei como consertar se for ...

Alguma ideia?


EDIT: Aqui está uma imagem para que você possa ver apenas como os campos personalizados são armazenados no banco de dados. Espero que isso ajude a descobrir por que o _events_meta[event_date] não funcionará na consulta?

Captura de tela do PHPMyAdmin com uma consulta Insert para o banco de dados WordPress http://staticloader.com/phpmyadmin.png

1
Josh

Josh, dê uma olhada: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...

Estou pensando em alterar como o WPAlchemy armazena valores por padrão ... tornando o modo EXTRACT padrão ...

0
farinspace

Eu também tenho um blog com campos personalizados em relação ao evento. Aqui está a consulta que usei em combinação com a função 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");

Ele selecionará todas as postagens com um campo personalizado chamado event_date e as comparará com a data atual (para filtrar eventos antigos) e as classificará por outro campo personalizado chamado event_start_date. Espero que este exemplo complexo mostre como você deve usar a função query_posts () corretamente.

Uma seleção simples que testa apenas a existência de um campo personalizado se parece com isso:

query_posts('meta_key=event_date'); 

Um simples ORDER BY de um campo personalizado se parece com isto:

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

Você pode ver muitos exemplos na descrição da API da função query_posts () .

2
2ndkauboy

Oi @ Josh :

Sua consulta funciona bem. Provavelmente, sua variável $events_metabox não está no escopo e faz com que seu código simplesmente falhe (estranhamente ele ainda roda o rodapé, não sei por quê). tente defini-lo como global na parte superior do seu modelo:

global $events_metabox

Se isso não funcionar, você terá que rastrear o problema de alguma outra forma, pois eu não sei o que seu código está fazendo com $events_metabox.

Depurar Usando Remoção Incremental e print_r()

Quando você se deparar com um problema como este, comece a remover peças até corrigir o problema. Se você está tentando ver se sua consulta está funcionando ou não, use print_r() para despejar os valores agrupados em <pre> tags para ver o que está acontecendo, por exemplo:

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

Além disso, use get_posts() em vez de SQL direto

Dito isto, eu altamente recomendo que você substitua sua consulta por uma chamada get_posts(). É uma prática recomendada no WordPress para sempre usar a API do WordPress e suas funções de consulta e nunca usar SQL direto a menos que não haja absolutamente nenhuma maneira em torno dele. Você obtém muitos benefícios, incluindo o cache embutido em alguns casos, eles lidam com coisas como garantir que apenas postagens publicadas sejam exibidas, a menos que você diga o contrário, e é menos provável que elas quebrem se mudarem a estrutura do banco de dados no futuro.

Aqui está a chamada get_posts() que você precisa para substituir sua consulta SQL codificada (com algumas ressalvas ):

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

Ou este equivalente faz exatamente a mesma coisa:

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

As ressalvas que mencionei são que sua consulta não filtrou não publicados, rascunhos etc .; meu palpite é o que get_posts() faz realmente mais do que você gostaria de qualquer maneira.

Os documentos do Codex para get_posts()

A documentação para get_posts() está aqui:

Mas, curiosamente , a melhor documentação para os argumentos get_posts() está na página query_posts() que você provavelmente também poderia usar para suas necessidades. Eu prefiro o maior controle de get_posts() mas YMMV .

De qualquer forma, query_posts() na verdade apenas chama get_posts() para que os argumentos sejam realmente idênticos:

0
MikeSchinkel