如何过滤定制元数据库中的结果集?

时间:2020-01-27 作者:pmb88

我正在添加一个插件,在管理woocommerce产品详细信息页面上添加一个自定义元框。它列出了包含该产品的已完成订单。我能够成功地将数据添加到该框中。但是,我想添加一个带有两个日期选择器的过滤器按钮来过滤数据。我一直在看meta box示例,它们将数据保存到记录中。但在我的情况下,我并没有保存数据,只是返回存在的数据。我将如何实现这一点?

Update: 以下是我目前拥有的代码:

function wporg_add_custom_box()
{
    $screens = [\'product\'];
    foreach ($screens as $screen) {
        add_meta_box(
            \'wporg_box_id\',           // Unique ID
            \'Orders that purchased this product\',  // Box title
            \'wporg_custom_box_html\',  // Content callback, must be of type callable
            $screen                   // Post type
        );
    }
}
add_action(\'add_meta_boxes\', \'wporg_add_custom_box\');

function wporg_custom_box_html($post)
{
?>
    <table>
        <tr>
            <td>Order ID</td>
            <td>Name</td>
            <td>Email</td>
            <td>Item Name</td>
            <td>Date Created</td>

        </tr>
    <?php
        // Access WordPress database
        global $wpdb;

        // Select Product ID
        $product_id = $post->ID;

        // Get the orders that bought the product
        // Only get those that are paid
        $statuses = array_map( \'esc_sql\', wc_get_is_paid_statuses() );
        $orders = $wpdb->get_col("
           SELECT DISTINCT p.ID FROM {$wpdb->posts} AS p
           INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
           INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id
           INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
           WHERE p.post_status IN ( \'wc-" . implode( "\',\'wc-", $statuses ) . "\' )
           AND im.meta_key IN ( \'_product_id\')
           AND im.meta_value = $product_id
        ");


        $i = 0;
        $arrayLength = count($orders);
        if ($arrayLength<=0)
        {
        echo \'<tr><td colspan="5">No one bought this yet.</td></tr>\';
        }
        else
        {
            while ($i < $arrayLength)
                {
                    //echo "<tr><td>". $orders[$i] ."</td></tr>";
                    $order = wc_get_order($orders[$i]);
                    foreach ($order->get_items() as $item_key => $item ){
                        //the variable stores it as string whereas the object returns it as integer
                        if ($item->get_product_id() === (int)$product_id){
                            echo "<tr><td>".$orders[$i]."</td><td>". $order->get_billing_first_name() . " " . $order->get_billing_last_name() ."</td><td>". $order->get_billing_email() ."</td><td>". $item->get_name() ."</td><td>". $order->get_date_created()->date(\'m-d-Y H:i:s\') ."</td></tr>";

                        }
                    }

                    $i++;
                }   
        }

    ?>
    <table>
<?php
}
?>

1 个回复
SO网友:BenB

要向代码中添加日期选取器,您应该将WordPress中包含的jQuery日期选取器加载到产品管理页面中,并编写一些自定义JS代码,以便根据选取的日期过滤产品。

您可以加载所有产品,然后使用代码对其进行过滤,或者仅通过Ajax加载特定日期之间的产品。如果您有许多产品,那么Ajax方法将更好地防止长时间加载。

在这里,您可以找到如何加载jQuery UI日期选择器:https://stackoverflow.com/a/27463687/2011434

在这里,您可以找到将脚本排入产品页面队列的几种方法How do I Enqueue styles/scripts on Certain /wp-admin Pages?

您可以在这里看到如何对admin Ajax执行Ajax调用的示例https://wordpress.stackexchange.com/a/112717/62909

相关推荐

WP Query for all posts

我有页面属性。php在循环文件夹中使用此代码。我只看到了8篇帖子(自定义帖子类型),但我想看到所有的帖子都有分页,怎么了?<?php $view = \'archive\'; if ( is_singular() ) $view = \'single\'; elseif ( is_search() ) $view = \'search\'; elseif ( is_404() ) $view = \'404\';&#