Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Wordpress+WooCommerce | MySQL技能不足_Php_Mysql_Wordpress - Fatal编程技术网

Php Wordpress+WooCommerce | MySQL技能不足

Php Wordpress+WooCommerce | MySQL技能不足,php,mysql,wordpress,Php,Mysql,Wordpress,我想做的是创建一个有多个下拉选择菜单的页面。每个菜单将包含一个产品类型,例如CPU、主板、图形卡等,该类别下的所有产品将显示在其价格旁边。因此,我要做的是创建一个页面模板,其中包含自定义PHP,以实现最终目标。下面是它的结果: 将类别名称设置为变量 从wplz_terms表中获取与给定类别名称匹配的任何term_id-将整个返回发送到格式正确的数组。 将表wplz_term_relationships中的所有术语_id解析为产品_id。 通过查询wplz_帖子并选择每个匹配的产品名称,解析上面返

我想做的是创建一个有多个下拉选择菜单的页面。每个菜单将包含一个产品类型,例如CPU、主板、图形卡等,该类别下的所有产品将显示在其价格旁边。因此,我要做的是创建一个页面模板,其中包含自定义PHP,以实现最终目标。下面是它的结果:

将类别名称设置为变量 从wplz_terms表中获取与给定类别名称匹配的任何term_id-将整个返回发送到格式正确的数组。 将表wplz_term_relationships中的所有术语_id解析为产品_id。 通过查询wplz_帖子并选择每个匹配的产品名称,解析上面返回的产品ID中列出的所有项目。 从wplz_Posteta中选择meta_值,其中post_id与上面返回的产品_id匹配,meta_key等于_price-然后获取步骤4和5的结果,并将它们放入一个数组中,该数组保存每个返回产品的名称和相应价格。 这是到目前为止我的代码。我花了很多时间试图找出我想寻找的左连接

/ Return all products in the category "CPU"
$term = 'CPU';

// Resolve Term to Term ID(s)
$query = "
    SELECT
    term_id
    FROM wplz_terms
    WHERE name = $term
";

// Execute the Query
$return = $wpdb->get_results($query, OBJECT);

// Properly Format the Result for an Array
$array = json_decode(json_encode($return),true);

// Flatten Array to Simple Array Function
function array_flatten_recursive($array) { 
   if (!$array) return false;
   $flat = array();
   $RII = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
   foreach ($RII as $value) $flat[] = $value;
   return $flat;
}
$flat = array_flatten_recursive($array);

// Format for Next MySQL Query
$in = implode(',', $flat);

// Resolve Term ID to Object ID(s) 
$query = "
    SELECT
    object_id
    FROM wplz_term_relationships
    WHERE term_taxonomy_id IN ($in)
";

// Execute the Query
$return = $wpdb->get_results($query, OBJECT);

// Properly Format the Result for an Array
$array = json_decode(json_encode($return),true);

// Refresh $flat Value
$flat = array_flatten_recursive($array);

// Format for Next MySQL Query
$in = implode(',', $flat);

// Resolve Products by the resulting Object ID(s)
$query = "
    SELECT
    id,
    post_title
    FROM wplz_posts 
    WHERE id IN ($in)
";

// Execute the Query
$return = $wpdb->get_results($query, OBJECT);

// Properly Format the Result for an Array
$array = json_decode(json_encode($return),true);

因此,如果我理解正确,您希望显示按分类术语筛选的帖子列表。这是WordPress在WP_查询中内置的内容:

如果您想筛选多个术语,只需将$terms替换为术语段塞数组

将结果显示为下拉菜单

假设查询已按上述代码设置,则模板代码如下所示:

<select name="product_choice" id="product_chooser">

<?php
    while ( $query->have_posts() ):
        $query->the_post();
        printf(
            '<option value="%d">%s - %s</option>',
            get_the_ID(),
            get_the_title(),
            get_post_meta( get_the_ID(), '_price', true )
        );
    endwhile;

    wp_reset_postdata();
?>

</select>

当然,您需要修改select的名称和ID以适应代码的其余部分,但这应该可以让您开始了。

这些产品是属于自定义post类型还是仅属于post类型?对于WooCommerce中的所有产品,post_类型被设置为product,当然页面被设置为page。是的,所以过滤和显示产品并不是我目前真正感兴趣的地方,它从wplz_Posteta表中检索每个产品的价格,并将其包含在产品名称所在的同一数组中。。。这样,我就可以使用foreach语句在数组中循环以填充select下拉选项。在模板中以及循环中,您可以使用get_post_meta get_ID,“_price”,true来检索您要查找的数据。太好了,非常感谢您的帮助。但是现在页面显示了每个产品的完整列表,我的尝试是简单地将数据放在一个数组中,然后为每个类别使用HTML下拉选择,其中只有产品名称和价格……在这种情况下,模板文件应该输出。我会用一个例子更新我的答案。呵呵,没问题。我们都必须从某个地方开始。答案是肯定的,在查询参数中添加'orderby'=>'title'和'order'=>'ASC'。通过WP_Query,您可以做各种各样的酷事:
<select name="product_choice" id="product_chooser">

<?php
    while ( $query->have_posts() ):
        $query->the_post();
        printf(
            '<option value="%d">%s - %s</option>',
            get_the_ID(),
            get_the_title(),
            get_post_meta( get_the_ID(), '_price', true )
        );
    endwhile;

    wp_reset_postdata();
?>

</select>