0

WordPressデータベースに独自のクエリを記述しましたが、行き詰まりました。私は次のような多くの(5)カスタムフィールドを持っています:

town
price
size
... etc

そしてsearch.phpで私は持っています:

$querystr = "
SELECT wposts.* 
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id ";

$town = addslashes($_GET['town']);
if($town!=''){
    $querystr .= " AND wpostmeta.meta_key = 'town' AND wpostmeta.meta_value = '".$town."'";
}

$mo = addslashes($_GET['mo']);
if($mo!='' && preg_match("/^\d+$/", $mo)){
    $querystr .= " AND wpostmeta.meta_key = 'price' AND wpostmeta.meta_value > '".$mo."'";
}

$md = addslashes($_GET['md']);
if($md!='' && preg_match("/^\d+$/", $md)){
    $querystr .= " AND wpostmeta.meta_key = 'price' AND wpostmeta.meta_value < '".$md."'";
}

$querystr .= " AND wposts.post_status = 'publish' AND wposts.post_type = 'post'";

$pageposts = $wpdb->get_results($querystr, OBJECT);

しかし、これは機能しません。条件を1つだけ使用する場合:

$querystr = "SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id ";

$town = addslashes($_GET['town']);
if($town!=''){
    $querystr .= " AND wpostmeta.meta_key = 'town' AND wpostmeta.meta_value = '".$town."'";
}

$querystr .= " AND wposts.post_status = 'publish' AND wposts.post_type = 'post'";
$pageposts = $wpdb->get_results($querystr, OBJECT);

その後、それは動作します。私が間違っているのは何ですか?

4

1 に答える 1

1

where条件が矛盾しているため、select式は全体として意味がありません。また、リレーショナル データベースの仕組みに関しても意味がありません。1 つのクエリで同じ列名を共有する 2 つの一意の行を一致させたい場合、これはsubqueriesなどの手法を使用しないと不可能です。

すべての式部分が true でなければならず、次のようになると考えてください。

SELECT wposts.*
FROM wp_posts wposts, wp_postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wpostmeta.meta_key = 'town' AND wpostmeta.meta_value = 'My town' 
AND wpostmeta.meta_key = 'price' AND wpostmeta.meta_value > 500

meta_keyここでは、 「町」に等しい AND meta_value「私の町」に等しいと言います。それは理にかなっていますが、「価格」に等しいと言うと、ANDmeta_key meta_value500より大きくなります。式が true になることはなく、パーサーは 2 つの異なる条件セットをグループ化する方法もありません。

WP_クエリ

可能であれば、データベースに直接クエリを実行する代わりにWP_Queryクラスを使用することをお勧めします。このラッパーは、コードを大幅に簡素化し、保守を容易にします。meta_queryオプションを使用するため、コードには WordPress >=3.1 が必要であることに注意してください。

クエリは次のように記述できます。

<?php

// The arguments that defines the query
$args = array(
    'post_status' => 'publish',
    'post_type' => 'post'
);

// We define the meta/custom field conditions

$meta_query = array();

// PS: No need to slash the values, WordPress will do that for us
$town = $_GET['town'];
$mo = (int) $_GET['mo']; // Simple sanitizment, implement your own as see fit
$md = (int) $_GET['md']; // Simple sanitizment, implement your own as see fit


if ( $town ) {
    $meta_query[] = array(
        'key' => 'town',
        'value' => $town
    );
}

if ( $mo ) {
    $meta_query[] = array(
        'key' => 'price',
        'value' => $mo,
        'type' => 'NUMERIC',
        'compare' => '>'
    );
}

if ( $md ) {
    $meta_query[] = array(
        'key' => 'price',
        'value' => $md,
        'type' => 'NUMERIC',
        'compare' => '<'
    );
}

if ( $meta_query ) {
    // Add the meta_query conditions to the arguments array

    $meta_query['relation'] = 'AND';

    $args['meta_query'] = $meta_query;
}

// Create WP_Query object with the arguments
$query = new WP_Query( $args );

// Fetch the posts
$posts = $query->get_posts();

// Voila!

?>
于 2013-02-21T22:45:18.520 に答える