我已经为此苦苦挣扎了几天,但我从EE论坛上没有得到任何回报。本质上,我正在尝试这样做(请参阅类别位):
{exp:channel:entries channel="events" category="7&(175|177)"}
但您不能将 AND/OR 类别请求与开箱即用的原生标签混合使用
我一直在尝试编写一个自定义查询来处理它,但我被困在如何处理类别帖子表上。
目前我的查询如下所示,但类别查询不起作用。
{exp:query sql="SELECT
type.cat_id,
type.cat_name as cat_name,
type.cat_url_title,
type.group_id,
t.title as title,
t.status,
t.channel_id,
t.site_id,
d.field_id_32 as date,
p.cat_id as cat_id
FROM
exp_categories type JOIN
exp_category_posts p ON type.cat_id = p.cat_id JOIN
exp_channel_titles t ON p.entry_id = t.entry_id JOIN
exp_channel_data d ON t.entry_id = d.entry_id
WHERE
t.status = 'open' AND
t.site_id = 1 AND
type.group_id = 2 AND
/* problem bit! */
(p.cat_id = 7 AND ((p.cat_id = 175) OR (p.cat_id = 177))) AND
t.channel_id = 3
GROUP BY
type.cat_id
ORDER BY
type.cat_order
LIMIT 5"}
如果有人以前做过这样的事情,或者可以看到我哪里出了问题,我真的很感激转向!
哇,真是个查询! 退后一步怎么样? 为什么不让你的外部循环只是逻辑的一部分,然后在循环内做平衡:
{exp:channel:entries channel="events" category="7"}
{categories show="175|177"}
{!-- do stuff --}
{/categories}
{/exp:channel:entries}
这可能正是您周五美好;)
所需要的-s.
这无法在单个查询中完成。我会为此构建一个简单的插件(开始使用 pkg.io)并执行几个查询,返回要传递给频道条目标签的entry_ids。
$cat_7_entries = $final_entries = array();
$cat_7_query = $this->EE->db->query("SELECT entry_id FROM exp_category_posts WHERE cat_id = 7");
if($cat_7_query->num_rows() > 0)
{
foreach($cat_7_query->result_array() as $row)
{
$cat_7_entries[] = $row['entry_id'];
}
$cat_7_entries = implode(',', $cat_7_entries);
$entries_query = $this->EE->db->query("SELECT entry_id FROM exp_category_posts WHERE cat_id IN(175,177) AND entry_id IN(".$cat_7_entries.")");
if($entries_query->num_rows() > 0)
{
foreach($entries_query->result_array() as $row)
{
$final_entries[] = $row['entry_id'];
}
$vars = array(0 => array('entry_ids' => implode('|', $final_entries)));
return $this->EE->TMPL->parse_variables($this->EE->TMPL->tagdata, $vars);
}
}
然后只需使用 parse="inward" 将标准频道条目标签与您的插件标签包装在一起。
{exp:my_plugin:my_method parse="inward"}
{exp:channel:entries channel="events" entry_id="{entry_ids}"}
...
{/exp:channel:entries}
{/exp:my_plugin:my_method}
这样做的好处是,标准频道条目标签会为您检查频道、状态、到期日期等,但只会返回与所有这些条目和您指定的合格entry_ids列表匹配的条目。
>@Penzizzle 我认为这里的秘密是,您需要在自己的专栏中基本上检查您感兴趣的三个类别。
下面是演示此技术的查询的简化版本:
SELECT
t.entry_id,
cat1.cat_id as cat1,
cat2.cat_id as cat2,
cat3.cat_id as cat3
FROM
exp_weblog_titles t
JOIN
exp_category_posts as cat1 ON cat1.entry_id = t.entry_id
JOIN
exp_category_posts as cat2 ON cat2.entry_id = t.entry_id
JOIN
exp_category_posts as cat3 ON cat3.entry_id = t.entry_id
WHERE
cat1.cat_id = 175 AND (cat2.cat_id = 177 OR cat3.cat_id = 175)
看看这对你有什么好处?
试试这个where子句:
WHERE
t.status = 'open' AND
t.site_id = 1 AND
type.group_id = 2 AND
t.channel_id = 3 AND
p.cat_id = 7 OR p.cat_id = 175 OR p.cat_id = 177
如果你真的想要这个逻辑:
/* problem bit! */
(p.cat_id = 7 AND ((p.cat_id = 175) OR (p.cat_id = 177))) AND
然后,您可能需要重新组织表和逻辑。