我正在使用高级自定义字段wordpress插件和一个名为"albums"的自定义帖子类型。
在自定义帖子类型中,我有 2 个自定义字段。
一个是名为"album_artists"的"user"类型字段,它将带有用户ID的数组存储到数据库中。
另一个是一个名为"release_date"的字段,它将时间戳存储到数据库中,是必填字段。
现在,在作者中.php我在"album_artists"字段中获得所有包含当前作者 ID 的"专辑"帖子。目前为止,一切都好。我使用自定义查询来管理它,该查询在"album_artists"字段的序列化数组中查找\"{userID}\",并且我能够获得所需的帖子。但是现在我想按其他自定义字段("release_date")的值对专辑帖子(目前按发布日期排序)进行排序,其中包含时间戳。
是否可以通过单个SQL查询来实现这一点,或者是否有任何其他想法可以实现这一点?这是我的自定义查询:
global $wpdb;
$results = $wpdb->get_results("
SELECT * FROM $wpdb->posts WHERE `ID` IN (
SELECT `post_id`
FROM $wpdb->postmeta
WHERE `meta_key` LIKE 'album_artists'
AND `meta_value` LIKE '%"{$curauth->ID}"%'
)
AND `post_type` LIKE 'albums'
AND `post_status` LIKE 'publish'
ORDER BY 'post_date' ASC
", OBJECT);
我建议你使用带有元键/值的WP_Query来做到这一点。这是我的代码,只需测试一下。
$args = array(
'post_type' => 'album',
'orderby' => 'meta_value',
'meta_query' => array(array('key' => 'release_date')),
'order' => 'ASC',
'paged'=>$paged,
'meta_query' => array(
array(
'key' => 'album_artists',
'value' => $curauth->ID,
'compare' => 'LIKE',
),
),
);
您可以使用'order' => 'ASC',
'order' => 'DESC',
更改排序顺序
您可以使用连接进行排序,因为我再次加入postmeta
以获取meta_value
,即meta_key
release_date的日期meta_value
因为类型是文本,您需要转换字符串日期值,以便它成为 MySQL 的日期对象并可用于排序结果,STR_TO_DATE
提供您当前的字符串日期格式,例如如果日期存储为 04/26/2015
则格式将被'%m/%d/%Y'
SELECT DISTINCT p.*
FROM $wpdb->posts p
JOIN $wpdb->postmeta m ON p.`ID` = m.post_id
JOIN $wpdb->postmeta m1 ON p.`ID` = m1.post_id
WHERE m.`meta_key` LIKE 'album_artists'
AND m.`meta_value` LIKE '%"{$curauth->ID}"%'
AND m1.`meta_key` LIKE 'release_date'
AND p.`post_type` LIKE 'albums'
AND p.`post_status` LIKE 'publish'
ORDER BY STR_TO_DATE(m1.meta_value, '%m/%d/%Y') ASC