通过自定义字段值对WordPress进行排序?
-
16-10-2019 - |
题
好,所以我正在使用 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
解决方案
乔什,看看: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...
我认为我将更改WPalchemy如何默认存储值...使提取模式默认...
其他提示
我还获得了一个有关事件的自定义字段的博客。这是我与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');
自定义字段的简单订单看起来像这样:
query_posts('meta_key=event_date&orderby=meta_value&order=ASC');
您可以在 query_posts()函数的API描述.
你好 @Josh:
您的查询工作正常。 可能是你的 $events_metabox
变量不在范围内,导致您的代码失败(奇怪的是,它仍然运行页脚,dunno为什么。
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
就是说,我会 高度 建议您用一个替换查询 get_posts()
称呼。这是WordPress的最佳实践 始终使用WordPress API及其查询功能 和 切勿使用直接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()
论点在 query_posts()
页 您也可能会用于您的需求。我更喜欢对 get_posts()
但 YMMV.
反正, query_posts()
实际上只是打电话 get_posts()
因此,论点确实是相同的: