it-swarm.cn

通过自定义字段值对WordPress帖子进行排序?

好的,所以我使用 WPAlchemy类 在写帖子中创建自定义字段写入面板页面,到目前为止一切都很好......但是,有一个问题我似乎无法弄清楚。我正在尝试使用“事件日期”的自定义字段值来对自定义页面模板上的事件进行排序。

我按照在codex中找到的指令 “基于自定义字段的查询和按值排序” 来尝试和设置自定义查询,但它似乎没有工作?

这是“事件”页面的自定义页面模板中的代码:

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

这就像它没有拿起自定义字段键...我用来创建这些自定义写面板的类将它们全部存储为数组,因此我尝试使用以下命令访问它们:_events_meta[event_date]

也许这就是问题所在,但如果它是......我不知道如何修复它。

有任何想法吗?


编辑:这是一个图像,因此您可以看到自定义字段如何存储在数据库中。希望这可以帮助你弄清楚为什么地球_events_meta[event_date]在查询中不起作用?

PHPMyAdmin的屏幕截图,带有WordPress数据库的插入查询http://staticloader.com/phpmyadmin.png

1
Josh

Josh,看看: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ......

我想我将改变WPAlchemy默认存储值的方式......使EXTRACT模式默认...

0
farinspace

我还有一个关于活动的自定义字段的博客。这是我与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");

它将使用名为event_date的自定义字段选择所有帖子,将其与当前日期进行比较(以过滤掉旧事件),并通过另一个名为event_start_date的自定义字段对其进行排序。我希望复杂的exmaple向您展示如何正确使用query_posts()函数。

仅测试自定义字段存在的简单选择如下所示:

query_posts('meta_key=event_date'); 

自定义字段的简单ORDER BY如下所示:

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

您可以在query_posts()函数的 API描述中看到许多示例

2
2ndkauboy

@ Josh

您的查询工作正常。可能是您的$events_metabox变量不在范围内并导致您的代码失败(奇怪的是它仍然运行页脚,不知道为什么。)首先修复它尝试将其设置为模板顶部的全局:

global $events_metabox

如果这不起作用,你将不得不以其他方式追踪问题,因为我不知道你的代码用$events_metabox做了什么。

使用增量删除和print_r()进行调试

当你遇到这样的问题时,开始拿走碎片直到你解决问题。如果您试图查看您的查询是否正常工作,请使用print_r()转储<pre>标记中包含的值,以便您可以看到发生了什么,即:

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

另外,使用get_posts()而不是Direct SQL

也就是说,我高度建议你用get_posts()调用替换你的查询。在WordPress中最好的做法是总是使用WordPress API,它的查询函数从不使用直接SQL,除非绝对没有办法周围。在某些情况下,您可以获得许多好处,包括内置缓存,它们可以处理诸如确保仅显示已发布的帖子之类的内容,除非您另有说明,并且如果将来更改数据库结构,则不太可能中断。

这是你需要替换硬编码SQL查询的get_posts()调用(带一些注意事项):

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

或者这个等价物完全相同:

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

我提到的警告是你的查询没有过滤掉未发表的,草稿等;我的猜测是get_posts()它实际上更像是你想要的东西。

get_posts()的法典文件

get_posts()的文档在这里:

但有趣的是get_posts()参数的更好的文档在query_posts()页面上,您也可以根据需要使用它。我更喜欢更好地控制get_posts()但是 YMMV

无论如何,query_posts()实际上只是调用get_posts()所以参数确实是相同的:

0
MikeSchinkel