如何添加过滤器以编辑数组的值

时间:2019-08-09 00:19:16

标签: php

我正在尝试更改在商店购买产品时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

1 个答案:

答案 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数组变量中的beforeafter值,并使用新的$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放入数组中,但是该函数未返回任何数据。

希望有帮助。