我正在尝试更改在商店购买产品时woocommerce收集的元数据的样式格式。
我找到了可以挂入的过滤器。。但是我不知道如何获取它来更改数据。
所以我迷上了$ html = apply_filters('woocommerce_display_item_meta',$ html,$ item,$ args);
我可以从输出中剥离html ...但是我似乎无法弄清楚如何使用分隔符,回显符,echo,autop,label_before和label_after来编辑$ args数组。
需要任何帮助!
//Here is the Wooocommerce code I want to change -
if ( ! function_exists( 'wc_display_item_meta' ) ) {
/**
* Display item meta data.
*
* @since 3.0.0
* @param WC_Order_Item $item Order Item.
* @param array $args Arguments.
* @return string|void
*/
function wc_display_item_meta( $item, $args = array() ) {
$strings = array();
$html = '';
$args = wp_parse_args(
$args,
array(
'before' => '<ul class="wc-item-meta"><li>',
'after' => '</li></ul>',
'separator' => '</li><li>',
'echo' => true,
'autop' => false,
'label_before' => '<strong class="wc-item-meta-label">',
'label_after' => ':</strong> ',
)
);
foreach ( $item->get_formatted_meta_data() as $meta_id => $meta ) {
$value = $args['autop'] ? wp_kses_post( $meta->display_value ) : wp_kses_post( make_clickable( trim( $meta->display_value ) ) );
$strings[] = $args['label_before'] . wp_kses_post( $meta->display_key ) . $args['label_after'] . $value;
}
if ( $strings ) {
$html = $args['before'] . implode( $args['separator'], $strings ) . $args['after'];
}
$html = apply_filters( 'woocommerce_display_item_meta', $html, $item, $args );
if ( $args['echo'] ) {
echo $html; // WPCS: XSS ok.
} else {
return $html;
}
}
}
我想将$ args数组更改为此:
'before' => '<span for="booked_product" class="wcfm-title wcfm_title">',
这样,格式将与元数据的去向匹配。
这是我用来编写订单元详细信息的代码!在前端,我使用woocommerce产品插件插件来收集其他信息...此代码会将其放置在任何地方。我已经在我想要的位置以外的其他地方测试了它。
//Function to Write Order Details In Booking Page
function add_more_booking_details() {
///Get Access
global $wp, $WCFM, $WCFMu, $thebooking, $wpdb;
if( !current_user_can( 'manage_bookings_settings' ) && !current_user_can( 'manage_bookings' ) ) {
wcfm_restriction_message_show( "Bookings" );
return;
}
if ( ! is_object( $thebooking ) ) {
if( isset( $wp->query_vars['wcfm-bookings-details'] ) && !empty( $wp->query_vars['wcfm-bookings-details'] ) ) {
$thebooking = get_wc_booking( $wp->query_vars['wcfm-bookings-details'] );
}
}
$booking_id = $wp->query_vars['wcfm-bookings-details'];
if( $booking_id ) {
$post = get_post($booking_id);
$booking = new WC_Booking( $post->ID );
$order = $booking->get_order();
$product_id = $booking->get_product_id( 'edit' );
$resource_id = $booking->get_resource_id( 'edit' );
$customer_id = $booking->get_customer_id( 'edit' );
$product = $booking->get_product( $product_id );
$resource = new WC_Product_Booking_Resource( $resource_id );
$customer = $booking->get_customer();
$statuses = array_unique( array_merge( get_wc_booking_statuses( null, true ), get_wc_booking_statuses( 'user', true ), get_wc_booking_statuses( 'cancel', true ) ) );
$statuses = apply_filters( 'wcfm_allowed_booking_status', $statuses );
}
if( wcfm_is_vendor() ) {
$is_booking_for_vendor = $WCFM->wcfm_vendor_support->wcfm_is_component_for_vendor( $booking_id, 'booking' );
if( !$is_booking_for_vendor ) {
if( apply_filters( 'wcfm_is_show_booking_restrict_message', true, $booking_id ) ) {
wcfm_restriction_message_show( "Restricted Booking" );
}
}
}
?>
<?php
if( $allow_wp_admin_view = apply_filters( 'wcfm_allow_wp_admin_view', true ) ) {
?>
<?php }
if ( $order && is_a( $order, 'WC_Order' ) ) { ?>
<?php }
///Print Order Details
$order_detail = getOrderDetailById($order);
print_r($order_detail);
}
//get order details
if (!function_exists('getOrderDetailById')) {
function getOrderDetailById($id) {
$order = wc_get_order($id);
foreach ($order->get_items() as $item_id => $item) {
$product = $item;
$order_data['line_items'][] =
wc_display_item_meta($item);
}
}
}
//Hook+Call Add Booking Details into Booking Details Block
add_action('wcfm_booking_details_block', 'add_more_booking_details' );
好吧...因此,下面提供的新代码(当链接到wp_head只是为了查看它时)将返回这样的元数据,而无需格式化。 Stray Data happening
答案 0 :(得分:0)
类似的事情应该可以解决问题
//if details entered are correct, take user to system info page
if(enteredUsername.equals(dbUsername)&&enteredPassword.equals(dbPassword)){
response.sendRedirect("ViewData.html");
}
///if details entered are incorrect, user remains on login page
else{
request.setAttribute("errorMessage", "Invalid user or password");
request.getRequestDispatcher("test.jsp").forward(request, response);
}
}//try end
上面的示例重新创建了add_filter('woocommerce_display_item_meta', function ($html, $item, $args) {
$strings = [];
$html = '';
foreach ($item->get_formatted_meta_data() as $meta_id => $meta) {
$value = $args['autop'] ? wp_kses_post($meta->display_value) : wp_kses_post(make_clickable(trim($meta->display_value)));
$strings[] = $args['label_before'] . wp_kses_post($meta->display_key) . $args['label_after'] . $value;
}
$args['before'] = '<span for="booked_product" class="wcfm-title wcfm">';
$args['after'] = '</span>';
if ($strings)
$html = $args['before'] . implode($args['after'] . $args['before'], $strings) . $args['after'];
return $html;
});
变量,因为该变量没有被过滤器传递。然后,我们更改$strings
数组变量中的before
和after
值,并使用新的$args
值重新创建$html
变量。
这未经测试,但我有信心它将按您的要求进行操作。对此可能会有更好的解决方案,但这是我目前所拥有的。
在提供其他信息后回答扩展
因此,根据您刚刚提供的代码,我会说您可以更改此行
$args
对此
$order_data['line_items'][] = wc_display_item_meta($item);
那应该为您解决问题。 $order_data['line_items'][] = wc_display_item_meta($item, [
'echo' => false,
'before' => '<span for="booked_product" class="wcfm-title wcfm">',
'after' => '</span>',
'seperator' => '</span><span for="booked_product" class="wcfm-title wcfm">'
]);
函数接受wc_display_item_meta
参数。
您提供的代码也有很多错误,我不确定您是否从代码中删除了点点滴滴,但无论如何,这里是经过重新编码的$args
函数。
getOrderDetailById
我添加了实例检查,因为从我所看到的来看,您正在传递function getOrderDetailById($id)
{
if ($id instanceof WC_Order)
$order = $id;
else
$order = wc_get_order($id);
$order_data['line_items'] = [];
foreach ($order->get_items() as $item_id => $item) {
$order_data['line_items'][] = wc_display_item_meta($item, [
'echo' => false,
'before' => '<span for="booked_product" class="wcfm-title wcfm">',
'after' => '</span>',
'seperator' => '</span><span for="booked_product" class="wcfm-title wcfm">'
]);
}
return $order_data['line_items'];
}
实例,而不是订单ID。我还添加了一个return语句,因为我可以看到您尝试将WC_Order
放入数组中,但是该函数未返回任何数据。
希望有帮助。