Php 在订单管理页面中编辑元数据
我有一个自定义的WooCommerce支付网关,它使用以下方式保存元数据:Php 在订单管理页面中编辑元数据,php,wordpress,woocommerce,metadata,orders,Php,Wordpress,Woocommerce,Metadata,Orders,我有一个自定义的WooCommerce支付网关,它使用以下方式保存元数据: $order->update_meta_数据(“示例数据”),esc_attr($_POST[“示例数据”) 然后显示在管理订单页面中,并使用以下命令进行编辑: // In constructor add_action('woocommerce_admin_order_data_after_order_details', array($this, 'display_payment_type_order_edit_pag
$order->update_meta_数据(“示例数据”),esc_attr($_POST[“示例数据”)代码>
然后显示在管理订单页面中,并使用以下命令进行编辑:
// In constructor
add_action('woocommerce_admin_order_data_after_order_details', array($this, 'display_payment_type_order_edit_pages'), 10, 1);
add_action('woocommerce_process_shop_order_meta', array($this, 'save_order_custom_field_meta'));
public function display_payment_type_order_edit_pages($order) {
$example_data = $order->get_meta('_example_data');
echo '<br class="clear" />';
echo '<h4>Example Details <a href="#" class="edit_address">Edit</a></h4>';
// Non-edit display.
echo '<div class="address">';
echo '<p><strong>' . __('Example Data') . ':</strong> ' . $example_data . '</p>';
echo '</div>';
echo '<div class="edit_address">';
woocommerce_wp_text_input(array(
'id' => '_example_data',
'label' => 'Example Data:',
'value' => $example_data,
'wrapper_class' => 'form-field-wide'
));
echo '</div>';
}
function save_order_custom_field_meta($post_id) {
if (isset($_POST['_example_data']))
update_post_meta($post_id, '_example_data', sanitize_text_field($_POST['_example_data']));
}
按照以下常规方式:
$my_class = new My_Payment_Gateway();
此外,我还发现添加这样的操作
add_action('woocommerce_process_shop_order_meta', array('my_payment_gateway', 'save_order_custom_field_meta'));
当钩子被激发时执行函数;当然有一个错误(以静态方式运行非静态)。那么,在插件文件中添加操作似乎会导致它无法工作
最后,如果我看到使用$wp\u filter['woocommerce\u process\u shop\u order\u meta']将哪些函数附加到钩子上
我可以看到save\u order\u custom\u field\u meta
附在后面。但是,当钩子运行时,它不会执行(通过日志记录、断点等确认)。您的代码优先函数不会显示您的可编辑字段,并且您正在使事情变得更加复杂。请尝试以下操作:
add_action('woocommerce_admin_order_data_在_order_详情之后,'display_custom_可编辑_字段_on_admin_orders');
功能显示\自定义\可编辑\字段\管理\订单($order){
回显“
';
woocommerce_wp_text_输入(数组(
'id'=>'\u示例\u数据',
“label'=>”(示例数据:),
'wrapper_class'=>'form field wide'
) );
回声';
}
添加操作('woocommerce\u process\u shop\u order\u meta'、'save\u order\u custom\u field\u meta');
函数save\u order\u custom\u field\u meta($post\u id){
如果(isset($_POST[''示例_data']))
更新发布元数据($发布id,''示例数据',清理文本字段($发布[''示例数据']);
}
代码位于活动子主题(或活动主题)的functions.php文件中。测试和工作
如果要在类中的插件中使用代码,可以在插件文件中使用以下内容:
/*
插件名称:管理命令可编辑字段
插件URI:
描述:你的运输方式插件
版本:1.0.0
作者:我
作者URI:
*/
如果(!class_存在('WC_Some_class')){
班上有几个班{
//在构造函数中
公共函数构造(){
#下面的设置有待定义
$this->text_domain='my_text_domain';//域名
$this->meta_key='\u example_data';//字段Id或字段slug
$this->label\u name=\uuu('Example Data',$this->text\u domain);//字段标签
#要触发的挂钩
添加操作('woocommerce\u admin\u order\u data\u after\u order\u details',数组('display\u custom\u editable\u field\u on\u admin\u orders');
添加动作('woocmerce\u process\u shop\u order\u meta',数组('save\u order\u custom\u field\u meta');
}
//构造器之外
公共功能显示\自定义\可编辑\字段\管理\订单($order){
回显“
';
woocommerce_wp_text_输入(数组(
'id'=>this->meta_键,
'label'=>$this->label_name.':',
'wrapper_class'=>'form field wide'
) );
回声';
}
公共函数保存\顺序\自定义\字段\元($post\u id){
如果(isset($\u POST[$this->meta\u key]))
更新发布元数据($发布id,''示例数据',清理文本字段($发布[$this->meta\u key]);
}
}
$some_class=新的WC_some_class();
}
经过测试,效果良好。感谢您的回复-我实现了您的更改,这些更改与我以前的一次尝试几乎相同。但是,在“管理订单”页面中编辑并按enter键时,数据仍然不会保存。我修改了上面的代码以反映我所做的更改。知道发生了什么吗?@Tym我已经在上一个WooCommerce版本上测试过了,我的代码工作正常,在管理单订单页面上按“更新”时保存了自定义字段值。所以我猜不出是什么在给你制造麻烦。我也不确定。。。这些字段出现在管理订单编辑页面中,它们使用正确的元数据(在签出时发送)填充,它们的ID正确(检查元素)。但是当编辑顺序时,数据不会被更新,即使我只是放了一些类似于update\u post\u meta($post\u id,“\u example\u data”,“test data replace”)代码>作为woocommerce\u process\u shop\u order\u meta
钩子下的函数。在编辑订单时,感觉钩子好像没有触发。我在WooCommerce 4.5.2版上
。是的!刚刚确认-使用WooCommerce Loggerwc_get_Logger()代码>和记录器->调试('example',$context)代码>我可以看到编辑订单时未调用save\u order\u custom\u field\u meta
。但是,我可以通过将记录器放在其他地方使其熄灭;只是为了确认这不是记录器的故障。@Tym收到了……这是另外一回事……我开始认为这种行为是由于使用加载的plugins\u
hook初始化插件造成的。我注意到以后重定向的任何钩子,例如woocommerce\u process\u shop\u order\u met
a或woocommerce\u save\u account\u details
,都不会执行给定的函数。无论类构造函数中是否使用了add\u action
,这都是正确的。
add_action('woocommerce_process_shop_order_meta', array('my_payment_gateway', 'save_order_custom_field_meta'));