【问题标题】:Wordpress - ACF - get posts with repeated start and ending dateWordpress - ACF - 获取具有重复开始和结束日期的帖子
【发布时间】:2015-02-24 12:49:52
【问题描述】:

我正在运行一个旅行网站,其中包含有开始和结束日期的旅程。现在,这些旅程可以每年进行数次。

现在我有一个包含三个重复开始和结束日期的单一帖子

01.03.2015 - 14.03.2015       2015-03-01  - 2015-03-14
01.04.2015 - 14.04.2015       2015-04-01  - 2015-04-14
01.05.2015 - 14.05.2015       2014-05-01  - 2015-05-14

我想显示我的帖子,其开始和结束日期包含在搜索日期范围内。

搜索 01.06.2015 - 01.07.2015 应该不会返回任何结果。 搜索 01.03.2015 - 01.04.2015 应该返回一个结果。

$reisen_query_args = array(
'post_type' => 'reisen',
'post_status' => 'publish',
'meta_query' => array(
    array(
        'key'       => 'reisezeiten_%_start',
        'compare'   => '>=',
        'value'     => $startdate,
        'type'      => 'DATE'
    ),
     array(
        'key'       => 'reisezeiten_%_end',
        'compare'   => '<=',
        'value'     => $enddate,
        'type'      => 'DATE'
    )
)

这行得通,我不知道为什么:

如果搜索范围是 01.03.2015 - 10.03.2015 (2015-03-01 - 2015-03-10),则帖子不会显示,这是正确的

但是

如果范围是 05.03.2015 - 16.03.2015 (2015-03-05 - 2015-03-16),则会显示错误的帖子,因为搜索开始日期必须是 01.03.2015 (2015-03.01) 或之前返回结果。

这仅在我有重复字段时发生。只要只存储一个日期 01.03.2015 - 14.03.2015 (2015-03-01 - 2015-03-14),查询就会按预期运行。

有人可以帮我解决这个问题吗?我现在正在寻找几周的时间来完成这项工作。

这是我的查询的样子:

SELECT SQL_CALC_FOUND_ROWS wp410_posts.ID
FROM wp410_posts
INNER JOIN wp410_term_relationships
ON (wp410_posts.ID = wp410_term_relationships.object_id)
INNER JOIN wp410_postmeta
ON ( wp410_posts.ID = wp410_postmeta.post_id )
INNER JOIN wp410_postmeta AS mt1
ON ( wp410_posts.ID = mt1.post_id )
WHERE 1=1
AND ( wp410_term_relationships.term_taxonomy_id IN (29) )
AND wp410_posts.post_type = 'reisen'
AND ((wp410_posts.post_status = 'publish'))
AND ( ( wp410_postmeta.meta_key LIKE 'reisezeiten_%_start'
AND CAST(wp410_postmeta.meta_value AS DATE) >= '2015-03-02' )
AND ( mt1.meta_key LIKE 'reisezeiten_%_end'
AND CAST(mt1.meta_value AS DATE) <= '2015-03-14' ) )
GROUP BY wp410_posts.ID
ORDER BY wp410_posts.menu_order ASC
LIMIT 0, 6

【问题讨论】:

  • 你能澄清一下吗? single 帖子是否包含三个带有 reisezeiten_%_start 键的 wp_postmeta 行和另外三个带有 ...end 键的行?还是三个不同的帖子,每个帖子都有自己的wp_postmeta 行?
  • 是的,它是一个包含六个 wp_postmeta 的单个帖子。三个开始键和三个结束键
  • 请再澄清一下!您似乎想查找开始和结束日期完全包含在搜索日期范围内的 reisen。因此,搜索 03-06-2015 - 03-07-2015 应该不会返回任何结果。搜索 02-20-2015 - 03-20-2015 应该返回一个结果。正确的?请编辑您的问题以澄清。
  • 您可能希望从wordpress.org/plugins/query-monitor 安装WP query-monitor 插件并使用它来检查生成的SQL。如果我自己尝试调试,我会这样做。
  • 顺便说一句,欢迎来到 Stack Overflow。感谢您发布一个真实的(而且是困难的!)问题。

标签: php mysql wordpress date advanced-custom-fields


【解决方案1】:

问题是您的请求不知道reisezeiten_1_start 对应于reisezeiten_1_end。因此它可以使用reisezeiten_2_startreisezeiten_1_start 作为您的示例。

您的范围:>=2015-03-05,

您的数据:

2015-03-01  - 2015-03-14
2015-04-01  - 2015-04-14
2014-05-01  - 2015-05-14

您的请求表示“我想要一个开始日期大于 2015-03-05 且一个结束日期小于 2015-03-16 的帖子”

所以:

2015-03-01  - 2015-03-14 => ending date correponds to your range
2015-04-01  - 2015-04-14 => start date corresponds to your range
2014-05-01  - 2015-05-14

所以你的比较在两个 meta_key 上是有效的并且帖子被返回。这解释了为什么您的代码使用一个日期。

就像马特所说的那样。 C,一种解决方案是在 meta_query 数组中使用多个项目(就像他说的:如果你有无限的行,它就行不通了)

$reisen_query_args = array(
    'post_type' => 'reisen',
    'post_status' => 'publish',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'relation' => 'AND',
            array(
                'key'       => 'reisezeiten_1_start',
                'compare'   => '>=',
                'value'     => $startdate,
                'type'      => 'DATE'
            ),
             array(
                'key'       => 'reisezeiten_1_end',
                'compare'   => '<=',
                'value'     => $enddate,
                'type'      => 'DATE'
            )
        ),
        array(
            'relation' => 'AND',
            array(
                'key'       => 'reisezeiten_2_start',
                'compare'   => '>=',
                'value'     => $startdate,
                'type'      => 'DATE'
            ),
             array(
                'key'       => 'reisezeiten_2_end',
                'compare'   => '<=',
                'value'     => $enddate,
                'type'      => 'DATE'
            )
        ),
        array(
            'relation' => 'AND',
            array(
                'key'       => 'reisezeiten_3_start',
                'compare'   => '>=',
                'value'     => $startdate,
                'type'      => 'DATE'
            ),
             array(
                'key'       => 'reisezeiten_3_end',
                'compare'   => '<=',
                'value'     => $enddate,
                'type'      => 'DATE'
            )
        )

    )
)

小心,此代码仅适用于 WP 4.1+

更多信息请参见codex(段落结尾)

ACF website的一些帮助

(对不起我的英语)

【讨论】:

  • 嘿。已经很久了。该项目一直搁置到现在。似乎这是解决此问题的唯一可行解决方案。现在,我试图将您的解决方案放在一个适当的数组中,这样我就不必为每个数字编写每个块。我找到了这个主题,但我无法解决我的问题:stackoverflow.com/a/14446234/4504590。我不知道如何处理 ''relation' => 'OR',' 甚至如何重复循环 10 次。有人可以帮我解决这个问题,还是我应该为此提出一个新问题?
  • 嗨@hes,你能展示你的代码吗? (使用 pastbin 或任何其他服务)
  • 嗨,乔尼先生。我已经在这里解决了这个问题:stackoverflow.com/questions/50788251/…。但随后出现了另一个问题,我在这里描述了:wordpress.stackexchange.com/questions/305856/…。也许你可以在那儿帮助我?
  • 好的,我没有评论您的其他问题的声誉(但您可以接受我的回答来增加它;))所以您是否尝试直接在数据库上执行 WP_Query 的 sql 以查看问题 ? (使用 phpmyadmin 或其他软件)。获取 sql:$query-&gt;request 此外,对于 10 个重复日期,我认为可能存在一些性能问题
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 2019-04-23
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多