信息发布→ 登录 注册 退出

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

发布时间:2025-10-08

点击量:

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

本文旨在解决在使用 WP_Query 在 WooCommerce 中获取订单详情时遇到的常见错误,并提供优化的代码示例。我们将重点关注如何正确获取订单 ID、订单项目,以及如何在 AJAX 调用中实现分页功能,避免常见的 500 错误,并确保数据正确显示。

使用 WP_Query 获取 WooCommerce 订单详情

在使用 WP_Query 查询 WooCommerce 订单时,需要注意几个关键点,以避免常见的错误。首先,要确保正确设置查询参数,特别是 post_type 和 post_status。其次,在循环中正确获取订单 ID 和订单对象。

示例代码:

以下代码展示了如何使用 WP_Query 获取已完成的 WooCommerce 订单,并获取订单 ID 和订单项目:

<?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' ] ) ) {
        # 保证页码大于等于 1
        $page = max( intval( $_POST[ 'page' ] ), 1 );
        # 每页显示订单数量
        $per_page = 4;

        // 查询已完成的订单
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-completed',
            'orderby'        => 'post_date',
            'order'          => 'DESC',
            'posts_per_page' => $per_page,
            'paged'          => $page,
        );

        $loop = new WP_Query( $args );
        $count = $loop->found_posts;

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

                // 获取订单 ID
                $order_id = $loop->post->ID;

                // 获取订单对象
                $order = wc_get_order( $loop->post->ID );
                $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> 
                    ';
                    }
                }
            }
        }

        // 分页逻辑
        $pages_num     = intval( ceil( $count / $per_page ) );
        $is_last_page  = $pages_num == $page;
        $is_first_page = $pages_num === 1;

        if ( $page >= 7 ) {
            $start_loop = $page - 3;
            if ( $pages_num > $page + 3 )
                $end_loop = $page + 3;
            else if ( $page <= $pages_num && $page > $pages_num - 6 ) {
                $start_loop = $pages_num - 6;
                $end_loop   = $pages_num;
            } else {
                $end_loop = $pages_num;
            }
        } else {
            $start_loop = 1;
            if ( $pages_num > 7 )
                $end_loop = 7;
            else
                $end_loop = $pages_num;
        }

        $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>";
            }
            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&quot;>' . $msg . '</div>' .
            '<div class = "pagination-n*">' . $pagination_html . '</div>';
    }
    die();
}
?>

关键点:

青泥AI 青泥AI

青泥学术AI写作辅助平台

青泥AI 360 查看详情 青泥AI
  • $loop->the_post();: 这个函数设置了全局 $post 变量,允许你使用 get_the_ID() 等函数。
  • $order_id = $loop->post->ID;: 使用 $loop->post->ID 获取订单ID。
  • $order = wc_get_order( $loop->post->ID );: 使用 wc_get_order() 函数获取订单对象。
  • $items = $order->get_items();: 使用 $order->get_items() 获取订单项目。

AJAX 分页

为了实现无需页面刷新的分页功能,需要使用 AJAX。以下代码展示了如何使用 AJAX 调用上述函数,并更新页面内容:

HTML 代码 (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"
                            };
                            // Send the data
                            $.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>

关键点:

  • admin_url( 'admin-ajax.php' ): 获取 WordPress AJAX 处理程序的 URL。
  • $.post(ajaxurl, data, function (response) { ... });: 使用 jQuery 的 $.post() 函数发送 AJAX 请求。
  • $(".pagination_container").html(response);: 使用返回的 HTML 更新页面内容。
  • $(document).on('click', '.pagination-link ul li', function () { ... });: 使用委托事件监听器处理分页链接的点击事件。
  • data-pagenum: 在分页链接上使用 data-pagenum 属性存储页码。

常见问题和注意事项

  • 500 错误: 500 错误通常是由于 PHP 代码中的错误引起的。请检查 functions.php 中的代码,确保没有语法错误或逻辑错误。 启用 WP_DEBUG 可以帮助你找到错误所在。
  • $loop 为 null: 如果 $loop 为 null,可能是由于 WP_Query 的参数设置不正确,导致没有查询到任何结果。请检查 post_type 和 post_status 等参数是否正确。
  • 安全: 始终对用户输入进行消毒和验证,以防止安全漏洞。 使用 sanitize_text_field() 函数对 $_POST['page'] 进行消毒。
  • 性能: 避免在循环中执行数据库查询,这可能会导致性能问题。 尽可能使用 WP_Query 或 wc_get_orders() 函数来批量获取订单数据。
  • get_the_ID() vs $loop->post->ID: 在 WP_Query 循环中,get_the_ID() 和 $loop->post->ID 通常是等价的,但建议使用 $loop->post->ID,因为它更明确地表示你正在访问当前循环中的文章 ID。
  • 分页参数: paged 参数用于指定当前页码。 确保正确计算 offset 值,以便在数据库中跳过正确的记录数。

总结

本文提供了一个完整的解决方案,用于在使用 WP_Query 在 WooCommerce 中获取订单详情时遇到的问题。 通过遵循这些步骤,你可以避免常见的错误,并实现高效、可靠的分页功能。记住,调试是解决问题的关键。 始终检查你的代码,并使用调试工具来查找错误。 通过理解这些概念并应用最佳实践,你可以构建强大的 WooCommerce 解决方案,满足你的业务需求。

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


相关文章: 网易大神账号申诉需要多久_网易大神账号申诉流程说明  微信群消息显示延迟如何解决 微信群消息刷新优化方法  Go语言中JSON数据解码与字段访问指南  Lar*el 8 多关键词数据库搜索优化实践  J*a递归快速排序中静态变量的状态管理与陷阱  解决深度学习模型训练初期异常高损失与完美验证准确率问题  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  outlook中文官网入口地址 outlook官方中文版直达首页链接  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Win11怎么开启高性能模式_Windows 11电源计划优化设置  深入理解Go语言中的指针类型:以*string为例  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  cad如何更改注释性对象的比例_cad注释性比例调整方法  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  韩剧圈正版入口页面_韩剧圈官网登录链接  LINUX怎么设置定时任务_LINUX crontab配置教程  百度网盘网页版入口 百度网盘网页版官方登录网址  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  使用Python高效删除Word宏并转换DOCM为DOCX格式  yandex入口引擎手机版 yandex安卓版下载入口  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  Centos/Linux 系统下安装 composer 的完整步骤  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  微信网页版扫码登录入口 微信网页版二维码登录入口  限制HTML日期输入框的日期选择范围  基于多条件高效更新SQL表:利用CASE表达式优化业务逻辑  CSS图片焦点样式实现教程:理解与应用tabindex属性  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  优化Lar*el Docker镜像:Composer与PHP版本控制策略  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  从OpenAI API响应中高效提取生成文本  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  网站内容防复制粘贴的实现策略与局限性  msn官网入口地址手机版 msn官方网站手机最新链接  J*aScript设计模式实践_j*ascript代码优化  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  Go语言实现持久化与原子性文件存储的教程  铃兰之剑为这和平的世界希里技能组及加点推荐  C#中解析不规范的HTML为XML 常见的坑与解决办法  Golang如何优雅处理error_Golang error处理最佳实践总结  2025-2030年全球乘用车销量预测:新能源成增长主力  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  实现分段式页面滚动导航:CSS与J*aScript教程 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!