【问题标题】:wordpress query troublewordpress 查询麻烦
【发布时间】:2010-08-13 09:48:46
【问题描述】:

编辑:

这是我正在运行查询的文件,可能有其他问题 - http://pastebin.com/4Cw3xMEM


这在 SQLyog 中用作直接查询

SELECT * FROM wp_posts
WHERE post_status = 'publish' 
AND post_type = 'post'
AND YEAR(post_date)=2010
ORDER BY post_date DESC;

它返回 2010 年的三个帖子 但是当我尝试通过我的 wordpress 运行它时,它会抽出所有帖子,无论日期如何

我知道有一些事情要做,所以它会选择正确的表格 据我所知,以下“应该”没问题

SELECT wposts.* 
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.post_status = 'publish' 
AND wposts.post_type = 'post'
AND YEAR(wposts.post_date)=2010
ORDER BY wposts.post_date DESC;

我真的不明白'wposts。 ',但它在 wordpress codex 的示例中使用了这种东西

最终目标是查询某个年份的帖子,并使用它来使 WP 显示每年的帖子组

我找不到任何有助于解释如何使用 wordpress 结构正确调用查询的内容

如果有人能解释其中的一些事情,那可能会有很大帮助,例如, 带有以下内容:

$wpdb->posts

我不知道 '->' 是干什么用的,我只看到它在 php 中用于在 foreach 中分配数组的一部分

  • 如何让这个东西发挥作用?

【问题讨论】:

  • 您的问题是什么?什么不起作用?
  • wposts. - 注意FROM $wpdb->posts wposts。这意味着“为此查询的帖子表定义别名wposts”,即wposts.post_date 表示$wpdb->posts 表的post_date 列。通常在您连接两个具有相同名称的列的表时使用,例如id,以区分您的意思。 wposts.* 表示 $wpdb->posts 表中的所有列。
  • 我认为是“请帮我写一个查询以提取所有按年份分组的 WP 帖子”

标签: php sql wordpress


【解决方案1】:

据我所知,您对自己太苛刻了。当我开始使用 WordPress 时,我是一名高级 SQL 开发人员,所以我想用 SQL 编写所有代码。事实证明,您几乎不需要在 WordPress 中使用 SQL,因为它有自己的 API 和内置的类似 URL 的查询语言以及缓存系统(缓存系统意味着您几乎不需要像您一样优化否则可能会这么想。)

这是一个独立的文件,您可以将其放在您网站的根目录中(可以称之为 test.php 吗?),以便您可以对其进行测试、调整选项并查看它是否有效:

<?php

include "wp-load.php";

$year = 2010;

$query = new WP_Query("post_type=any&posts_per_page=-1&year={$year}");
echo "<h1>Year: {$year}</h1>";
echo '<ul>';
foreach($query->posts as $post) {
    echo "<li>{$post->post_title} [post_type={$post->post_type}]</li>";
}
echo '</ul>';

我提到的从上面提取的查询语言如下所示:

post_type=any&posts_per_page=-1&year=2010

例如,您也可以以数组形式查询(这实际上取决于您的用例和/或您的偏好):

$query = new WP_Query(array(
    'post_type' => 'any',
    'posts_per_page' => -1,
    'year' => $year,
));

WP_Query() 的查询参数比我上面使用的三个要多得多。您可以在此处找到这些参数的最佳文档:

请注意,WP_Query() 只是在 WordPress 中查询的一种方式。还有query_posts()get_posts(),您也可以在钩子期间与查询进行交互。

是的,有时您需要使用 SQL,但在 WordPress 中更好,特别是如果您避免使用 SQL 并尽可能使用 API,则可以实现向后兼容性。

希望这会有所帮助。

-迈克

附:想要更多关于 WordPress 查询的信息?让我建议您在一周内向完整的公共测试版开放时在 WordPress Answers 提问(WordPress Answers 来自 StackExchange,与 StackOverflow 相同。)WordPress Answers 更有可能为您提供比 WordPress 更好的答案在这里,因为该站点将充满 WordPress 专家,而不是这里的通才(以及其他知识渊博的人)。

【讨论】:

  • 非常感谢 +1 - 我现在已经全部解决了!我从来没有对 URL 查询感到陌生,这让事情变得如此简单
  • 是的,一旦你学会了它,它确实很容易。有时我仍然渴望 SQL,因为 SQL 是一种更紧凑的语言,特殊情况更少,并且与应用程序更正交,但为了可维护性,使用内置的数据库 API 确实很有意义。很高兴它有帮助!
【解决方案2】:

如果以后的格式适合您,请改用它。至于:

$wpdb->posts

-&gt; 与对象的属性和方法一起使用。在上述情况下,$wpdb 是一个对象,它必须是由 wordpress 在某处使用new 关键字创建的,posts$wpdb 对象的属性,它可以从数据库中获取所有帖子。

无论类成员是方法还是属性,都可以用尾括号() 来识别。例如:

$wpdb->posts    // property
$wpdb->post()   // method

您可能想看看 PHP OOP 基础知识:

【讨论】:

  • ahhhhhh 所以它是一个属性,我只是习惯于这样的事情:object.property 我的大脑不想将它识别为相同的东西,链接 +1 的 ty 但这仍然不能解决我的数据库问题
【解决方案3】:

$wpdb 是 WordPress 中用于包含与 WordPress 数据库相关的内容的全局对象。 ->posts 部分意味着获取该对象的“posts”成员(或者换句话说,一个公共变量)。我只能假设这是您调用导致问题的查询的方式。您应该使用类似于...的东西。

$querystr = "SELECT wposts.* 
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.post_status = 'publish' 
AND wposts.post_type = 'post'
AND YEAR(wposts.post_date)=2010
ORDER BY wposts.post_date DESC";
$results = $wpdb->get_results($querystr, OBJECT);

foreach ($results as $r) {
    echo $r->title; // echo out variables from table
}

【讨论】:

  • 除了 foreach 的内容之外,我的代码几乎相同,但无论日期如何,它仍然返回所有帖子
  • 回显 $querystr 会得到什么?
  • 我得到了 SQL 查询,为什么会是别的?
  • 哦,你的意思是 {$wpdb} 部分,它给出了正确的表格。
  • 好吧,如果您回显的值在复制/粘贴到 phpMyAdmin 等 MySQL 工具时正常工作,那么我看不出 $results 如何可能包含更多答案。
【解决方案4】:
$wpdb->posts

这意味着$wpdb 是一个对象,您尝试访问该对象的帖子属性。

我对wordpress一无所知,但是,如果你想在字符串中使用这种语法(用“分隔”,你应该使用

${wpdb->posts}

那就试试吧

$query = "SELECT wposts.* 
          FROM ${wpdb->posts} wposts, ${wpdb->postmeta} wpostmeta
          WHERE wposts.post_status = 'publish' 
          AND wposts.post_type = 'post'
          AND YEAR(wposts.post_date)=2010
          ORDER BY wposts.post_date DESC;";

【讨论】:

  • 语法错误,意外的 T_OBJECT_OPERATOR - 它不应该更像 {$wpdb->posts} 因为 $wpdb 是一个 php 变量...测试我的方式,仍然失败:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多