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->have_posts() ) { while ( $loop->have_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="'%20.%20%24product%5B%20'download_url'%20%5D%20.%20'" target="_blank">Download</a>'; } } $msg = '
Ordine #' . esc_attr( $orders_id ) . ' | Prodotto ' . wp_kses_post( $product_name ) . ' | Data ' . wp_kses_post( $date_created ) . ' | Prezzo ' . wp_kses_post( $order_total ) . ' | Stato ' . wp_kses_post( $status ) . ' | File Visualizza |
- ";
if ( !$is_first_page ) {
$pagination_html .= "
- Previous "; } else { $pagination_html .= "
- Previous "; } for ( $i = $start_loop; $i {$i}"; else $pagination_html .= "
- {$i} "; } if ( !$is_last_page ) { $pagination_html .= "
- Next "; } else { $pagination_html .= "
- Next "; } $pagination_html .= "
关键点:
- $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/javascript"> 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中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT
人工智能驱动投资研究,做出更明智的决策

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

usemailto:inhreftCreateeMaillinks.startwithforbasiclinks,add?object = and&body = forpre-flycontent,andIncludeMultipleDresseSorcc =,bcc = foradvancedOptions。

本教程详细介绍了如何使用CSS精确隐藏HTML页面中的特定文本内容,避免因不当选择器导致整个父元素被隐藏的问题。通过为目标文本的包裹元素添加专属CSS类,并利用display: none;属性,开发者可以实现对页面元素的精细化控制,确保只隐藏所需部分,从而优化页面布局和用户体验。

UsethetitleattributeforsimpletooltipsorCSSforcustom-styledones.1.Addtitle="text"toanyelementfordefaulttooltips.2.Forstyledtooltips,wraptheelementinacontainer,use.tooltipand.tooltiptextclasseswithCSSpositioning,pseudo-elements,andvisibilityc

usecssfloatpropertytowraptextaroundanimage:floatleftfortextextontheright,floatrightfortextontheleft,addmarginforspacing,and clearFloatFloatStopReventLayOutissues。

setThelangattributeInthehtmltagtagtagtospecifepageLanguage,例如forenglish; 2.使用“ es” es“ es” forspanishor“ fr” forfrench; 3. IncludereVariantswariantswariantswithCountryCountryCodeslike“ en-us” en-us“ en-us”或“ zh-cn”;

本文探讨了在包含跨域iframe的父div上捕获mousedown事件的挑战。核心问题在于浏览器安全策略(同源策略)阻止了对跨域iframe内容的直接DOM事件监听。除非控制iframe源域名并配置CORS,否则无法实现此类事件捕获。文章将详细解释这些安全机制及其对事件交互的限制,并提供可能的替代方案。

本文探讨了在HTML中调用外部JavaScript函数时常见的两个问题:脚本加载时机不当导致DOM元素未就绪,以及函数命名可能与浏览器内置事件或关键字冲突。文章提供了详细的解决方案,包括调整脚本引用位置和遵循良好的函数命名规范,以确保JavaScript代码能够正确执行。

在使用Bootstrap进行网页布局时,开发者常遇到元素默认并排显示而非垂直堆叠的问题,尤其当父容器应用了Flexbox布局时。本文将深入探讨这一常见布局挑战,并提供解决方案:通过调整Flex容器的flex-direction属性为column,利用Bootstrap的flex-column工具类,实现H1标签与表单等内容块的正确垂直排列,确保页面结构符合预期。
