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

时间:2010-08-29 作者:Josh

好的,所以我使用WPAlchemy class 在写文章页面中创建自定义字段写面板,到目前为止一切都很顺利。。。然而,有一个问题我似乎无法解决。我试图使用“事件日期”的自定义字段值对自定义页面模板上的事件进行排序。

我按照指示做了"Query based on Custom Field and Sorted by Value" 在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]

也许这就是问题所在,但如果它是。。。

有什么想法吗?


EDIT: 这是一幅图像,您可以看到自定义字段是如何存储在数据库中的。希望这能帮你弄明白为什么_events_meta[event_date] 在查询中不起作用?

Screenshot of PHPMyAdmin with an Insert Query for the WordPress database http://staticloader.com/phpmyadmin.png

3 个回复
最合适的回答,由SO网友:farinspace 整理而成

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

我想我会改变WPAlchemy默认存储值的方式。。。正在设置提取模式默认值。。。

SO网友:2ndkauboy

我还得到了一个关于事件的自定义字段博客。下面是我与query\\u 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\\u date的自定义字段的帖子,将其与当前日期进行比较(以过滤旧事件),并按另一个名为event\\u start\\u date的自定义字段对其进行排序。我希望complex exmaple向您展示如何正确使用query\\u posts()函数。

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

query_posts(\'meta_key=event_date\'); 
自定义字段的简单顺序如下所示:

query_posts(\'meta_key=event_date&orderby=meta_value&order=ASC\');
您可以在API description of the query_posts() function.

SO网友:MikeSchinkel

你好@Josh:

Your query works fine. 可能是你的$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() 与直接SQL不同的是highly 建议您将查询替换为get_posts() 呼叫WordPress的最佳实践是always use the WordPress API and it\'s query functionsnever use direct SQL 除非根本没有办法。您可以获得许多好处,包括内置缓存。在某些情况下,它们可以处理诸如确保只显示已发布的帖子,除非您另有说明,并且如果它们将来更改数据库结构,则不太可能中断。

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

$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() on Codexthe better documentation for get_posts() arguments is on the query_posts() page 你也可以用它来满足你的需要。我更喜欢控制get_posts() 但是YMMV.

    无论如何query_posts() 实际上只是打电话而已get_posts() 因此,这些参数实际上是相同的:

结束

相关推荐