Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在订单管理页面中编辑元数据_Php_Wordpress_Woocommerce_Metadata_Orders - Fatal编程技术网

Php 在订单管理页面中编辑元数据

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

我有一个自定义的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_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 Logger
wc_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'));