我是Wooccommerce的新手,我知道很多语言。。。除了PHP!此外,我不太了解Wordpress钩子和回调是如何工作的,所以对于我想做的任务,我非常迷茫。
我唯一想做的就是在订单完成后发送的电子邮件中添加二维码。
我首先理解的是,我必须覆盖文件customer-completed-order.php
,并将其放在我的主题文件夹中。
问题是,这个文件是这样的:
<?php
/**
* Customer completed order email
*
* This template can be overridden by copying it to yourtheme/woocommerce/emails/customer-completed-order.php.
*
* HOWEVER, on occasion WooCommerce will need to update template files and you
* (the theme developer) will need to copy the new files to your theme to
* maintain compatibility. We try to do this as little as possible, but it does
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerceTemplatesEmails
* @version 3.7.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/*
* @hooked WC_Emails::email_header() Output the email header
*/
do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
s
<?php /* translators: %s: Customer first name */ ?>
<p><?php printf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $order->get_billing_first_name() ) ); ?></p>
<p><?php esc_html_e( 'We have finished processing your order.', 'woocommerce' ); ?></p>
<?php
/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
* @since 2.5.0
*/
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );
/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
/**
* Show user-defined additional content - this is set in each email's settings.
*/
if ( $additional_content ) {
echo wp_kses_post( wpautop( wptexturize( $additional_content ) ) );
}
/*
* @hooked WC_Emails::email_footer() Output the email footer
*/
do_action( 'woocommerce_email_footer', $email );
它似乎不是添加我的回调的地方。我所做的是将这个代码添加到我的主题中的functions.php
中,我想知道这是否是一个好地方,以及我的代码是否也可以接受(为了简单起见,我现在没有使用二维码(:
add_action( 'woocommerce_email_before_order_table', 'add_qr_code_to_email', 20, 4 );
function add_qr_code_to_email( $order, $sent_to_admin, $plain_text, $email ) {
if ( $email->id == 'customer_completed_order' ) {
echo '<h2 class="email-upsell-title">Get 20% off</h2><p class="email-upsell-p">Thank you for making this purchase! Come back and use the code "<strong>Back4More</strong>" to receive a 20% discount on your next purchase! Click here to continue shopping.</p>';
}
}
最后,我的最后一个问题是(这不是最重要的(:为什么它有效?我认为这是强制性的";调用回调";用";do_action;在customer-completed-order.php
中,但我的函数似乎仍然被称为
-
没错。您不会将函数添加到模板文件中。您可以在functions.php中添加它们,然后从模板中运行它们。
-
你的代码看起来还可以。一种常见的方法是创建不同的文件,然后它们将它们导入你的functions.php。但这是为了更容易维护和可读。你可以看看这个回购是如何做到这一点的例子
-
为什么它有效这实际上是最重要的问题,因为它是理解WP和WC开发如何工作的关键。
如果仔细查看要覆盖的文件,它几乎只是输出标记/内容并执行WooCommerce内置的操作(do_action
(。
我建议阅读这些文档(见最后的链接(,但要简单地回答你的问题:
操作允许我们在WordPress核心、插件和主题的执行中的特定点运行功能。换句话说,Action Hook就是Wordpress赋予我们扩展或修改核心功能的能力。
可以为这些操作分配不同的回调函数。这些回调函数将在挂接的操作运行时运行。
因此,回过头来看,模板中的每个do_action()
函数都在运行一个操作,该操作只运行与其挂钩的所有函数(在本例中由WooCommerce执行(。
因此,它之所以有效,是因为您正在将函数连接到'woocommerce_email_before_order_table'
操作。
如果你阅读每个do_action
上面的评论,它实际上说明了它们的吸引力。在您的模板中,'woocommerce_email_order_details'
操作的注释表示它挂接了WC_Emails::order_details()
,并输出了顺序表。
现在,该函数正在获取一个模板文件并对其进行渲染。您在代码中钩住的操作就是在该模板中运行的。(有关该类及其方法,请参见wp-content/plugins/woocommerce/includes/class-wc-emails.php
的第403行(
希望我足够清楚。
更新资源列表以阅读更多信息:
- add_action((文档
- do_action
- 官方文件
- WordPress动作挂钩教程
p.s:动作是WP中两种类型的挂钩之一。还有过滤器。