Как отобразить SQL запрос ie с шорткодом к внешнему интерфейсу WordPress - PullRequest
0 голосов
/ 06 февраля 2020

Я использовал 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

Я добавил этот код в функции моей темы. 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 запрос ie без каких-либо ошибок?

1 Ответ

1 голос
/ 06 февраля 2020

Вы забыли экранировать кавычки в $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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...