如何为自定义分类更新WordPress自定义SQL Select查询,以确保语法正确?

时间:2013-03-28 作者:mzwarg

我有一个Wordpress网站,是在自定义分类法完全实现之前,由第三方web开发人员为2.9版编写的。我们已经升级到最新的wordpress版本3.5。x、 有一个SQL Select查询在Wordpress错误中生成了一系列错误。日志文件。

在此模板中,我们使用了一些自定义分类法。我关心的问题如下:

(wp\\u term\\u taxonomy.taxonomy)作业

这里的一个关键点是not all Wordpress posts are using the taxonomy field jobs. 因此,一些帖子不会有任何与之相关的“工作”术语。

下面是我经常看到的错误

WordPress database error You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near \'))\' at 
line 9 for query 

  SELECT DISTINCT p.* FROM wp_posts p, wp_terms t, wp_term_taxonomy tt,
  wp_term_relationships tr, wp_terms t2, wp_term_taxonomy tt2, wp_term_relationships tr2
    WHERE p.id = tr.object_id
      AND t.term_id = tt.term_id
      AND tr.term_taxonomy_id = tt.term_taxonomy_id
      AND p.id = tr2.object_id
      AND t2.term_id = tt2.term_id
      AND tr2.term_taxonomy_id = tt2.term_taxonomy_id
      AND (tt.taxonomy = \'category\' AND tt.term_id = t.term_id AND t.term_id = \'22\')
      AND (tt2.taxonomy = \'jobs\' AND tt2.term_id = t2.term_id AND t2.name IN ())

made by require(\'wp-blog-header.php\'), require_once(\'wp-includes/template-loader.php\'),
include(\'/themes/generic/page.php\')
下面是PHP模板文件中的代码片段。

<?
else :
$playlist = 0; $jobs = null; $job = null; $terms = null;
$jobs = wp_get_object_terms( $post->ID, \'jobs\', array(\'fields\'=>\'names\'));
$term_count = 0;
foreach($jobs as $job) :
    if ($term_count > 0) :
        $terms .= ", \'".$job."\'";
    else :  
        $terms .= "\'".$job."\'" ;
    endif;
    $term_count++;
endforeach;
$sql =  "
        SELECT DISTINCT p.* FROM $wpdb->posts p, $wpdb->terms t, $wpdb->term_taxonomy tt, $wpdb->term_relationships tr, $wpdb->terms t2, $wpdb->term_taxonomy tt2, $wpdb->term_relationships tr2
        WHERE p.id = tr.object_id
        AND t.term_id = tt.term_id
        AND tr.term_taxonomy_id = tt.term_taxonomy_id
        AND p.id = tr2.object_id
        AND t2.term_id = tt2.term_id
        AND tr2.term_taxonomy_id = tt2.term_taxonomy_id
        AND (tt.taxonomy = \'category\' AND tt.term_id = t.term_id AND t.term_id = \'22\')
        AND (tt2.taxonomy = \'jobs\' AND tt2.term_id = t2.term_id AND t2.name IN ($terms))
        ";
if (! $results = $wpdb->get_results($sql)) :
?> 
从PHP文件中的逻辑推断,我看到了变量$terms 使用创建NULL 价值A.foreach 循环用于查找jobs 并将其附加到变量$terms. 接下来,SQL Select查询在最后一个AND条件中使用此变量。

如果$terms 变量,则SQL在不存在任何问题的情况下进行评估。

但是如果在$terms 变量是的NULL. 然后,SQL生成一个语法错误。

如何重写以处理NULL 的值$terms 运行SQL查询时的变量?

我希望我问这个问题足够完整。提前感谢您的任何意见。

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

不应使用直接SQL查询,而应尝试WP_Query 税务查询,例如:

$args = array(
    \'post_type\' => \'post\',
    \'tax_query\' => array(
        \'relation\' => \'AND\',
        array(
            \'taxonomy\' => \'category\',
            \'field\' => \'id\',
            \'terms\' => array( 22 )
        ),
        array(
            \'taxonomy\' => \'job\',
            \'field\' => \'name\',
            \'terms\' => $terms,
            \'operator\' => \'IN\'
        )
    )
);
$query = new WP_Query( $args );
其中$terms是术语名称的数组。

SO网友:vancoder

如果$条款为空,会发生什么?是否未选择记录?

如果是这种情况,您可能只需将$terms的初始值设置为一个伪字符串即可:

$terms = \'no terms\';

结束

相关推荐

WordPress mysqli and PDO

WordPress代码库是否使用mysqli或PDO?我知道PDO优于mysqli,但mysqli也不错。此外,PDO优于mysqli的一个特性(即数据库不可知)对WordPress意义不大,因为WordPress总是使用mysql服务器。但PDO支持将参数与数据类型绑定,但mysqli不支持,这是一件好事。我的直觉告诉我WordPress确实使用了mysqli,但我还无法在代码库中看到它。我的第二个问题是,如果WordPress正在使用mysqli,是因为速度问题,还是因为在早些时候(开发WP时),PD