WooCommerce 自定义 WP_Query 获取订单详情时出错的解决方案


woocommerce 自定义 wp_query 获取订单详情时出错的解决方案

本文旨在解决在使用 WP_Query 自定义查询 WooCommerce 订单详情时遇到的 500 错误问题。通过分析问题代码,提供修复后的代码示例,并详细解释代码逻辑和注意事项,帮助开发者正确使用 WP_Query 获取和展示 WooCommerce 订单数据,实现分页加载等功能。本文还提供优化后的代码示例,使其更易于理解和维护。

在使用 WP_Query 获取 WooCommerce 订单详情时,经常会遇到一些问题,特别是当涉及到 AJAX 调用和分页功能时。 出现 500 错误通常是因为在循环内部使用了不正确的变量或方法来获取订单信息。以下将详细介绍如何正确地使用 WP_Query 来获取 WooCommerce 订单详情,并提供可行的解决方案。

问题分析

原始代码中存在几个问题:

  1. 错误的订单 ID 获取方式: 使用 $loop->post->ID 获取订单 ID 在 WP_Query 循环中是不正确的。应该使用 get_the_ID() 函数。
  2. 重复查询: 代码中使用了两个 WP_Query 实例,一个用于循环,另一个用于计数。这会导致不必要的性能开销。
  3. 分页逻辑复杂: 分页逻辑可以简化,使用 WP_Query 的 paged 参数可以更方便地实现分页。
  4. 代码可读性差: 代码结构可以优化,使其更易于理解和维护。

解决方案

以下是修复后的代码示例,它解决了上述问题并提供了更清晰的实现方式:

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 86 查看详情 CA.LA

functions.php

<?php

add_action( 'wp_ajax_demo_pagination_posts', 'demo_pagination_posts' );
add_action( 'wp_ajax_nopriv_demo_pagination_posts', 'demo_pagination_posts' );

function demo_pagination_posts() {
    global $wpdb;

    if ( isset( $_POST['page'] ) ) {
        // Sanitize and validate the page number
        $page = max( intval( $_POST['page'] ), 1 );
        $per_page = 4; // Number of orders per page

        // WP_Query to retrieve shop orders with pagination
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-completed',
            'orderby'        => 'post_date',
            'order'          => 'DESC',
            'posts_per_page' => $per_page,
            'paged'          => $page, // Use the 'paged' parameter for pagination
        );

        $loop = new WP_Query( $args );
        $count = $loop->found_posts; // Total number of posts found

        $msg = '';

        if ( $loop->h*e_posts() ) {
            while ( $loop->h*e_posts() ) {
                $loop->the_post();

                // Get the order ID
                $order_id = get_the_ID();

                // Get an instance of the WC_Order Object
                $order = wc_get_order( $order_id );

                if ( $order ) {
                    $items          = $order->get_items();
                    $orders_id      = $order->get_id();
                    $status         = wc_get_order_status_name( $order->get_status() );
                    $date_created   = $order->get_date_created()->date( 'd/m/Y' );
                    $payment_method = $order->get_payment_method_title();
                    $order_total    = $order->get_formatted_order_total();

                    foreach ( $items as $item ) {
                        $product_name = $item->get_name();
                        $view_order   = $order->get_view_order_url();
                        $product      = $item->get_product();

                        if ( $product instanceof WC_Product ) {
                            $order_img       = $product->get_image();
                            $downloads       = $order->get_downloadable_items();
                            $download_button = '';

                            if ( is_array( $downloads ) ) {
                                foreach ( $downloads as $product ) {
                                    $download_button = '<a href="' . $product['download_url'] . '" target="_blank">Download</a>';
                                }
                            }

                            $msg .= '
                                <table class="table_orders" border="2">
                                    <tr class="table_row_items">
                                        <td class="product_number">
                                            <span class="mobile title">Ordine</span>
                                            <span>#' . esc_attr( $orders_id ) . '</span>
                                        </td>

                                        <td class="product_name">
                                            <span class="mobile title">Prodotto</span>
                                            <a href="' . wp_kses_post( $view_order ) . '">' . wp_kses_post( $product_name ) . '</a>
                                        </td>

                                        <td class="product_data">
                                            <span class="mobile title">Data</span>
                                            <span>' . wp_kses_post( $date_created ) . '</span>
                                        </td>

                                        <td class="product_price">
                                            <span class="mobile title">Prezzo</span>
                                            <span>' . wp_kses_post( $order_total ) . '</span>
                                        </td>

                                        <td class="product_status">
                                            <span class="mobile title">Stato</span>
                                            <span class="label ' . $order->get_status() . '">' . wp_kses_post( $status ) . '</span>
                                        </td>

                                        <td class="product_action">
                                            <span class="mobile title">File</span>
                                            <a target=”_blank” href="' . esc_url( $view_order ) . '">Visualizza<i class="fa-duotone fa-eye"></i></a>
                                        </td>
                                    </tr>
                                </table>
                            ';
                        }
                    }
                }
            }
        }

        // Pagination logic
        $pages_num = intval( ceil( $count / $per_page ) );
        $is_last_page = $pages_num == $page;
        $is_first_page = $page === 1;

        $pagination_html = "<div class='pagination-link'>";
        $pagination_html .= "<ul>";

        if ( !$is_first_page ) {
            $pagination_html .= "<li data-pagenum='" . ( $page - 1 ) . "' class='active'>Previous</li>";
        } else {
            $pagination_html .= "<li class='inactive'>Previous</li>";
        }

        // Display page numbers
        $start_loop = max( 1, $page - 3 );
        $end_loop = min( $pages_num, $page + 3 );

        for ( $i = $start_loop; $i <= $end_loop; $i++ ) {
            if ( $page == $i ) {
                $pagination_html .= "<li data-pagenum='$i' class='selected'>{$i}</li>";
            } else {
                $pagination_html .= "<li data-pagenum='$i' class='active'>{$i}</li>";
            }
        }

        if ( !$is_last_page ) {
            $pagination_html .= "<li data-pagenum='" . ( $page + 1 ) . "' class='active'>Next</li>";
        } else {
            $pagination_html .= "<li class='inactive'>Next</li>";
        }

        $pagination_html .= "</ul>";
        $pagination_html .= "</div>";

        echo '<div class="pagination-content">' . $msg . '</div>';
        echo '<div class="pagination-n*">' . $pagination_html . '</div>';

        wp_reset_postdata(); // Reset the global post data
    }

    die();
}

custom-template.php

<div class="wrap">
    <div id="primary" class="content-area">
        <div class="col-md-12 content">
            <div class="inner-box content no-right-margin darkviolet">
                <script type="text/j*ascript">
                    jQuery(document).ready(function ($) {
                        // This is required for AJAX to work on our page
                        var ajaxurl = '<?php echo admin_url( 'admin-ajax.php' ); ?>';

                        function load_all_posts(page) {
                            var data = {
                                page: page,
                                action: "demo_pagination_posts"
                            };

                            $.post(ajaxurl, data, function (response) {
                                $(".pagination_container").html(response);
                            });
                        }

                        load_all_posts(1); // Load page 1 as the default

                        $(document).on('click', '.pagination-link ul li', function () {
                            var page = $(this).attr('data-pagenum');
                            load_all_posts(page);
                        });
                    });
                </script>
                <div class="pag_loading">
                    <div class="pagination_container">
                        <div class="post-content"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

代码解释

  1. 使用 get_the_ID() 获取订单 ID: 在 WP_Query 循环内部,使用 get_the_ID() 函数来获取当前订单的 ID。
  2. 使用 paged 参数进行分页: WP_Query 的 paged 参数用于指定当前页码,简化了分页逻辑。
  3. 简化分页逻辑: 分页逻辑被简化,使用 max() 和 min() 函数来确定循环的起始和结束页码。
  4. HTML 结构: HTML 结构被优化,使其更易于阅读和维护。
  5. 错误处理: 添加了对 $order 对象的判断,确保订单对象存在。
  6. 使用 wp_reset_postdata(): 在 WP_Query 循环之后,调用 wp_reset_postdata() 函数来恢复全局 $post 对象。

注意事项

  • 确保你的 WooCommerce 版本是最新的,以避免潜在的兼容性问题。
  • 在处理订单数据时,务必进行适当的验证和转义,以防止安全漏洞。
  • 根据实际需求调整每页显示的订单数量。
  • 优化 AJAX 请求,减少服务器负载。
  • 使用浏览器的开发者工具来调试 AJAX 请求和响应。

总结

通过本文,你应该能够理解如何正确地使用 WP_Query 来获取 WooCommerce 订单详情,并实现分页加载等功能。 修复后的代码示例解决了原始代码中存在的问题,并提供了更清晰的实现方式。记住要遵循最佳实践,确保你的代码安全、高效和易于维护。

以上就是WooCommerce 自定义 WP_Query 获取订单详情时出错的解决方案的详细内容,更多请关注php中文网其它相关文章!


# 并与  # 衢州网站优化渠道  # seo历史  # 许昌网站关键词推广排名  # 湘艺苑营销推广方案  # 邢台关键词网络推广排名  # 上市公司网站建设要求  # 怎么当营销号抖音推广  # 酒店网站建设需求分析  # 微博推广营销效率高吗  # 凡科网站seo  # 加载  # 后端  # 更清晰  # 正确地  # 不正确  # php  # 等功能  # 使其  # 自定义  # 分页  # red  # 代码可读性  # ai  # 工具  # 浏览器  # ajax  # html  # jquery  # java  # javascript 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  纯CSS实现滚动时动态时间轴线条颜色填充效果  荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化  小红书网页版首页入口 小红书网页版电脑端官方登录链接  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  追剧达人如何发弹幕  优化响应式标题底部边框:CSS实现技巧与最佳实践  哔哩哔哩黑名单怎么查看  diskgenius分区工具如何设置Bios启动项  OPPO A3 WiFi频繁断开怎么办 OPPO A3网络优化技巧  电子白板帮助菜单使用指南  Composer如何使用composer-plugin-api开发自定义插件  《淘票票》添加到苹果钱包教程  TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法  《虎扑》关闭社区内容推荐方法  顺丰快递在线查询系统 顺丰快递官方查单入口  《密马》发布账号方法  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  快递查询,一键速查  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  AO3中文版手机快速通道_AO3最新稳定链接更新  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法  如何外贸网站设计-能留住客户提升用户体验!  在Dash应用中自定义HTML标题和网站图标  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  快手极速版在线体验区 快手极速版网页体验入口  yy漫画登录页面官方入口_yy漫画在线阅读网址入口  KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  《原神》月之一版本新增书籍一览  在Django单元测试中优雅处理信号:基于环境的条件执行策略  苹果手机手电筒无法开启  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  Go反射进阶:访问内嵌结构体中的被遮蔽方法  Vue 3中独立响应式实例的创建与应用  济南公交卡手机充值指南  51漫画网实时入口 51漫画网页版官方免费漫画入口  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法  多闪APP官方下载安装入口_多闪最新版本获取入口 

 2025-10-08

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.