新闻中心
WooCommerce 自定义 WP_Query 获取订单详情报错解决方案

本文旨在解决在使用自定义 WP_Query 获取 WooCommerce 订单详情时遇到的 500 错误以及数据获取失败的问题。通过分析错误原因,提供了优化后的代码示例,并详细解释了如何正确地使用 WP_Query 来实现订单数据的分页加载和展示,避免常见的错误和陷阱。
在使用 WP_Query 获取 WooCommerce 订单详情时,可能会遇到一些问题,例如服务器返回 500 错误,或者查询结果为空。这些问题通常与查询参数设置不正确、循环使用方式不当,以及对 WooCommerce 对象的使用方式有关。下面将详细介绍如何解决这些问题,并提供一个可用的代码示例。
问题分析
- 500 错误: 500 错误通常表示服务器内部错误。在使用 WP_Query 时,如果在循环内部尝试获取订单 ID 或者订单项目时出现问题,可能是因为 $post 对象没有正确设置。
- 查询结果为空: 即使没有 500 错误,查询结果也可能为空。这可能是因为查询参数设置不正确,例如 post_type 或 post_status 设置错误,或者分页参数没有正确传递。
解决方案
1. 正确设置 WP_Query 参数
确保 WP_Query 的参数设置正确,特别是 post_type 和 post_status。对于 WooCommerce 订单,post_type 应该是 shop_order,post_status 应该是 wc-completed 或其他订单状态。此外,为了实现分页,需要正确设置 posts_per_page 和 paged 参数。
$paged = max( 1, 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' => $paged,
);
$loop = new WP_Query( $args );2. 正确使用 the_post() 函数
在 WP_Query 的循环内部,必须调用 the_post() 函数来设置 $post 对象。这使得可以使用 get_the_ID() 函数获取当前订单的 ID。
if ( $loop->h*e_posts() ) {
while ( $loop->h*e_posts() ) {
$loop->the_post();
$order_id = get_the_ID(); // 正确获取订单 ID
$order = wc_get_order( $order_id ); // 使用订单 ID 获取 WC_Order 对象
// ... 其他代码 ...
}
wp_reset_postdata(); // 重置 $post 对象,避免影响其他查询
}3. 获取订单详情
获取订单详情需要使用 WC_Order 对象。通过 wc_get_order() 函数,可以使用订单 ID 获取 WC_Order 对象,然后使用该对象的方法来获取订单的各种信息,例如订单状态、订单项目、总金额等。
青泥AI
青泥学术AI写作辅助平台
360
查看详情
$order = wc_get_order( $order_id );
if ( $order ) {
$orders_id = $order->get_id(); // 获取订单 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(); // 获取格式化的订单总金额
$items = $order->get_items(); // 获取订单项目
foreach ( $items as $item ) {
$product_name = $item->get_name(); // 获取产品名称
$product_id = $item->get_product_id(); // 获取产品ID
$product = wc_get_product( $product_id ); // 获取产品对象
if($product){
$product_image = $product->get_image(); // 获取产品图片
}
// ... 其他代码 ...
}
}4. 完整代码示例
下面是一个完整的代码示例,展示了如何使用 WP_Query 获取 WooCommerce 订单详情,并进行分页显示:
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;
$msg = '';
if ( isset( $_POST[ 'page' ] ) ) {
$paged = max( 1, intval( $_POST[ 'page' ] ) );
$per_page = 4;
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-completed',
'orderby' => 'post_date',
'order' => 'DESC',
'posts_per_page' => $per_page,
'paged' => $paged,
);
$loop = new WP_Query( $args );
$count = $loop->found_posts;
if ( $loop->h*e_posts() ) {
while ( $loop->h*e_posts() ) {
$loop->the_post();
$order_id = get_the_ID();
$order = wc_get_order( $order_id );
if ( $order ) {
$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();
$items = $order->get_items();
foreach ( $items as $item ) {
$product_name = $item->get_name();
$product_id = $item->get_product_id();
$product = wc_get_product( $product_id );
if($product){
$product_image = $product->get_image();
}
$view_order = $order->get_view_order_url();
$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>
';
}
}
}
wp_reset_postdata();
}
$pages_num = intval( ceil( $count / $per_page ) );
$is_last_page = $pages_num == $paged;
$is_first_page = $paged === 1;
$pagination_html = "<div class='pagination-link'>";
$pagination_html .= "<ul>";
if ( !$is_first_page ) {
$pagination_html .= "<li data-pagenum='" . ( $paged - 1 ) . "' class='active'>Previous</li>";
} else {
$pagination_html .= "<li class='inactive'>Previous</li>";
}
for ( $i = 1; $i <= $pages_num; $i++ ) {
if ( $paged == $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='" . ( $paged + 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>' .
'<div class = "pagination-n*">' . $pagination_html . '</div>';
}
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 ($) {
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);
$(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>5. 注意事项
- 安全性: 对 $_POST['page'] 进行严格的验证和过滤,防止 SQL 注入攻击。使用 intval() 函数将其转换为整数,并确保其值大于等于 1。
- 性能: 避免在循环内部执行复杂的数据库查询或计算,以提高性能。
- 错误处理: 添加适当的错误处理机制,例如检查 wc_get_order() 函数是否返回有效的 WC_Order 对象。
- 代码重用: 将代码封装成函数或类,以便在其他地方重用。
总结
通过正确设置 WP_Query 参数、使用 the_post() 函数、获取订单详情,并添加适当的错误处理机制,可以解决在使用自定义 WP_Query 获取 WooCommerce 订单详情时遇到的问题。以上提供的代码示例可以作为一个起点,根据实际需求进行修改和扩展。记住要始终关注代码的安全性、性能和可维护性。
以上就是WooCommerce 自定义 WP_Query 获取订单详情报错解决方案的详细内容,更多请关注php中文网其它相关文章!
# javascript
# 谷歌SEO有用吗
# 便捷的清河网站建设
# 配置文件
# 不正确
# 表单
# 可以使用
# 参数设置
# 是因为
# 查询结果
# 分页
# php
# java
# jquery
# html
# 前端
# ajax
# ai
# 自定义
# 报错
# 高雄百度关键词排名
# 湛江网站建设定制开发
# oppor7的营销推广
# 红安短视频seo托管费用
# 市场推广和营销渠道
# 运城seo网站优化
# 化州物流公司网站建设
# 网站建设常用模块包括哪些
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
最新韩小圈网页版登录入口_官网在线观看官方链接
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
苹果手机如何防止被恶意App追踪
海棠账号登录入口_登录海棠账户同步阅读记录
mc.js免安装版 mc.js一键畅玩入口
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
微信群消息显示延迟如何解决 微信群消息刷新优化方法
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
J*aScript动态修改指定div内所有a标签样式指南
解决Django多数据库/多Schema环境下外键迁移问题
小红书网页版入口链接分享 小红书官网直接进
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
AO3中文官网链接_AO3网页版稳定镜像站
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
不同用户不同价格! 索尼开启账户个性化定价测试
2026春节假期时间安排 2026春节假日查询
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
微信网页版官方快速登录入口 微信网页版网页版账号直达
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
Promise错误处理:在catch后终止链式then执行的策略
Python中高效访问嵌套字典与列表中的键值对
C++如何解决segmentation fault_C++段错误调试与原因分析
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
React Router 嵌套组件中 URL 重定向问题的解决方案
LINUX怎么设置定时任务_LINUX crontab配置教程
HTML长属性值处理:表单action路径优化与代码规范应对
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
痛风发作了怎么办? 快速止痛和后期饮食调理
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
Django模型中自动计算可用余额的实现方法
AngularJS $http POST请求数据传递与Go后端接收实践
composer的"require-dev"部分是用来做什么的?
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
Django表单提交验证失败后保持字段值不刷新
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
免费抖音短视频入口_抖音网页版短视频免费通道
必由学官网入口 必由学教师登录入口
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
BetterDiscord插件中安全更新用户简介的实践指南
荣耀Play7T运行卡顿解决_荣耀Play7T性能优化
b站怎么删除评论_b站评论管理与删除操作
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
163邮箱登录密码 163邮箱忘记密码找回
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件


2025-10-08
浏览次数:次
返回列表