【问题标题】:How to display a SQL querie with a shortcode to the WordPress frontend如何在 WordPress 前端显示带有简码的 SQL 查询
【发布时间】:2020-02-06 12:22:47
【问题描述】:

我将 Wordpress 与 WooCommerce 一起使用。某些订单不仅应该在后端可见,还应该在前端可见。

现在我创建了一个 SQL 查询(在 phpMyAdmin 中工作)。结果应显示在网站上的表格中。

SELECT
            p.ID as order_id,
            p.post_date,
            max( CASE WHEN pm.meta_key = 'donateAnonym' AND p.ID = pm.post_id THEN pm.meta_value END ) as donateAnonym,
            max( CASE WHEN pm.meta_key = '_billing_email' AND p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
            max( CASE WHEN pm.meta_key = '_billing_first_name' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_first_name,
            max( CASE WHEN pm.meta_key = '_billing_last_name' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_last_name,
            max( CASE WHEN pm.meta_key = '_billing_city' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_city,
            max( CASE WHEN pm.meta_key = '_billing_state' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_state,
            max( CASE WHEN pm.meta_key = '_order_total' AND p.ID = pm.post_id THEN pm.meta_value END ) as order_total,
            ( SELECT GROUP_CONCAT( order_item_name separator '|' ) FROM wp_woocommerce_order_items WHERE order_id = p.ID ) as order_items
        FROM
            wp_posts p 
            JOIN wp_postmeta pm on p.ID = pm.post_id
            JOIN wp_woocommerce_order_items oi on p.ID = oi.order_id
        GROUP BY
            p.ID

我将此代码添加到我的主题的functions.php 文件中。现在可以通过将[showAllHrOrdersTable] 添加到任何页面或帖子来显示来自该功能的信息。

add_shortcode( 'showAllHrOrdersTable', 'showAllHrOrders' );

function showAllHrOrders( $args ) {

    $SQLstring = 'SELECT
            p.ID as order_id,
            p.post_date,
            max( CASE WHEN pm.meta_key = 'donateAnonym' AND p.ID = pm.post_id THEN pm.meta_value END ) as donateAnonym,
            max( CASE WHEN pm.meta_key = '_billing_email' AND p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
            max( CASE WHEN pm.meta_key = '_billing_first_name' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_first_name,
            max( CASE WHEN pm.meta_key = '_billing_last_name' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_last_name,
            max( CASE WHEN pm.meta_key = '_billing_city' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_city,
            max( CASE WHEN pm.meta_key = '_billing_state' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_state,
            max( CASE WHEN pm.meta_key = '_order_total' AND p.ID = pm.post_id THEN pm.meta_value END ) as order_total,
            ( SELECT GROUP_CONCAT( order_item_name separator '|' ) FROM wp_woocommerce_order_items WHERE order_id = p.ID ) as order_items
        FROM
            wp_posts p 
            JOIN wp_postmeta pm on p.ID = pm.post_id
            JOIN wp_woocommerce_order_items oi on p.ID = oi.order_id
        GROUP BY
            p.ID';

    global $wpdb;

    $content = '<table>';
    $content .= '</tr><th>Family</th>';
        $content .= '<th>Name</th>';
        $content .= '<th>City</th></tr>';
    $results = $wpdb->get_results( $SQLstring );

    foreach ( $results AS $row ) {
        $content .= '<tr><td>' . $row->_billing_first_name . '</td>';
            $content .= '<td>' . $row->_billing_last_name . '</td>';
            $content .= '<td>' . $row->_billing_city . '</td></tr>';
    }
    $content .= '</table>';

    return $content;
}

问题:当我使用快捷方式上传并启动页面时,出现以下错误:

Parse error: syntax error, unexpected 'donateAnonym' (T_STRING) in .../themes/.../functions.php

注意事项: 当我将 SQLString 更改为 SELECT * FROM ... 时,错误消失了,但一些重要的列(例如 donateAnonym)会丢失。

add_shortcode( 'showAllHrOrdersTable', 'showAllHrOrders' );

function showAllHrOrders( $args ) {

    $SQLstring = 'SELECT *
        FROM
            wp_posts p 
            JOIN wp_postmeta pm on p.ID = pm.post_id
            JOIN wp_woocommerce_order_items oi on p.ID = oi.order_id
        GROUP BY
            p.ID';

    global $wpdb;

    $content = '<table>';
    $content .= '</tr><th>Family</th>';
        $content .= '<th>Name</th>';
        $content .= '<th>City</th></tr>';
    $results = $wpdb->get_results( $SQLstring );

    foreach ( $results AS $row ) {
        $content .= '<tr><td>' . $row->_billing_first_name . '</td>';
            $content .= '<td>' . $row->_billing_last_name . '</td>';
            $content .= '<td>' . $row->_billing_city . '</td></tr>';
    }
    $content .= '</table>';

    return $content;
}

如何实现我的 sql 查询而不出现任何错误?

【问题讨论】:

    标签: php sql wordpress


    【解决方案1】:

    您忘记在$SQLstring 中转义引号:

    $SQLstring = 'SELECT
                p.ID as order_id,
                p.post_date,
                max( CASE WHEN pm.meta_key = \'donateAnonym\' AND p.ID = pm.post_id THEN pm.meta_value END ) as donateAnonym,
                max( CASE WHEN pm.meta_key = \'_billing_email\' AND p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
                max( CASE WHEN pm.meta_key = \'_billing_first_name\' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_first_name,
                max( CASE WHEN pm.meta_key = \'_billing_last_name\' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_last_name,
                max( CASE WHEN pm.meta_key = \'_billing_city\' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_city,
                max( CASE WHEN pm.meta_key = \'_billing_state\' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_state,
                max( CASE WHEN pm.meta_key = \'_order_total\' AND p.ID = pm.post_id THEN pm.meta_value END ) as order_total,
                ( SELECT GROUP_CONCAT( order_item_name separator \'|\' ) FROM wp_woocommerce_order_items WHERE order_id = p.ID ) as order_items
            FROM
                wp_posts p 
                JOIN wp_postmeta pm on p.ID = pm.post_id
                JOIN wp_woocommerce_order_items oi on p.ID = oi.order_id
            GROUP BY
                p.ID';
    

    更好,更易读:

    $SQLstring = "SELECT
                p.ID as order_id,
                p.post_date,
                max( CASE WHEN pm.meta_key = 'donateAnonym' AND p.ID = pm.post_id THEN pm.meta_value END ) as donateAnonym,
                max( CASE WHEN pm.meta_key = '_billing_email' AND p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
                max( CASE WHEN pm.meta_key = '_billing_first_name' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_first_name,
                max( CASE WHEN pm.meta_key = '_billing_last_name' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_last_name,
                max( CASE WHEN pm.meta_key = '_billing_city' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_city,
                max( CASE WHEN pm.meta_key = '_billing_state' AND p.ID = pm.post_id THEN pm.meta_value END ) as _billing_state,
                max( CASE WHEN pm.meta_key = '_order_total' AND p.ID = pm.post_id THEN pm.meta_value END ) as order_total,
                ( SELECT GROUP_CONCAT( order_item_name separator '|' ) FROM wp_woocommerce_order_items WHERE order_id = p.ID ) as order_items
            FROM
                wp_posts p 
                JOIN wp_postmeta pm on p.ID = pm.post_id
                JOIN wp_woocommerce_order_items oi on p.ID = oi.order_id
            GROUP BY
                p.ID";
    

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2023-03-11
      • 2020-07-10
      • 2012-06-26
      • 2012-11-28
      相关资源
      最近更新 更多