Php 在Woocommerce中使用表单添加自定义支付网关

Php 在Woocommerce中使用表单添加自定义支付网关,php,wordpress,woocommerce,payment-gateway,custom-fields,Php,Wordpress,Woocommerce,Payment Gateway,Custom Fields,在Woocommerce中,我希望有一个完整表单的自定义支付网关。该表格的答案显示在验证页面中,我想这是英文版的感谢页面,在后台,按顺序排列 我的PHP不够好,不能完全靠我自己来创建这个。 但我学会更好,努力理解代码是如何工作的 所以我试图找到一些接近我问题的东西 我找到了一个极好的答案: 对我的问题有90%的答案 我发现自己如何添加其他类型的表单元素,如文本、复选框 /** * Output the "payment type" radio buttons fields

在Woocommerce中,我希望有一个完整表单的自定义支付网关。该表格的答案显示在验证页面中,我想这是英文版的感谢页面,在后台,按顺序排列

我的PHP不够好,不能完全靠我自己来创建这个。 但我学会更好,努力理解代码是如何工作的

所以我试图找到一些接近我问题的东西 我找到了一个极好的答案:

对我的问题有90%的答案

我发现自己如何添加其他类型的表单元素,如文本、复选框

      /**
     * Output the "payment type" radio buttons fields in checkout.
     */
    public function payment_fields(){
        if ( $description = $this->get_description() ) {
            echo wpautop( wptexturize( $description ) );
        }

        /**echo '<style>#transaction_type_field label.radio { display:inline-block; margin:0 .8em 0 .4em}</style>';**/

        $option_keys = array_keys($this->options);

        woocommerce_form_field( 'transaction_type-1', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Espèces', $this->domain),
        ), reset( $option_keys ) );

        woocommerce_form_field( 'transaction_type-2', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Tickets restaurants', $this->domain),
        ), reset( $option_keys ) );

        woocommerce_form_field( 'transaction_type-3', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Chèques vacances', $this->domain),
        ), reset( $option_keys ) );

        woocommerce_form_field( 'transaction_type-4', array(
            'type'          => 'radio',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Payment Information - Test', $this->domain),
            'options'       => $this->options,
        ), reset( $option_keys ) );


    }
但它不起作用。 我想我错过了一些我不明白的东西,也许是关于这件事:

reset( $option_keys )

因此,如果您有我的问题的解决方案和解释,或者至少有一个线索,它将对我有很大帮助。

尝试以下多个复选框的替换代码函数:

    /**
     * Output the "payment type" fields in checkout.
     */
    public function payment_fields(){
        if ( $description = $this->get_description() ) {
            echo wpautop( wptexturize( $description ) );
        }

        woocommerce_form_field( 'transaction_type-1', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Espèces', $this->domain),
        ), '' );

        woocommerce_form_field( 'transaction_type-2', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Tickets restaurants', $this->domain),
        ), '' );

        woocommerce_form_field( 'transaction_type-3', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Chèques vacances', $this->domain),
        ), '' );

        $option_keys = array_keys($this->options);

        woocommerce_form_field( 'transaction_type-4', array(
            'type'          => 'radio',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Payment Information - Test', $this->domain),
            'options'       => $this->options,
        ), reset( $option_keys ) );
    }

    /**
     * Save the chosen payment type as order meta data.
     *
     * @param object $order
     * @param array $data
     */
    public function save_order_payment_type_meta_data( $order, $data ) {
        if ( $data['payment_method'] === $this->id ) {
            $meta_value = array(); // Initializing

            if ( isset($_POST['transaction_type-1']) ) {
                $meta_value[1] = __('Espèces', $this->domain);
            }

            if ( isset($_POST['transaction_type-2']) ) {
                $meta_value[2] = __('Tickets restaurants', $this->domain);
            }

            if ( isset($_POST['transaction_type-3']) ) {
                $meta_value[3] = __('Chèques vacances', $this->domain);
            }

            // Save transaction type (from fields 1 to 3) as an array
            if( sizeof($meta_value) > 0 ) {
                $order->update_meta_data('_transaction_type', $meta_value );
            }

            // Save transaction type test (from fields 4) as a string
            if ( isset($_POST['transaction_type-4']) ) {
                $order->update_meta_data('_transaction_type_test', esc_attr($_POST['transaction_type-4']) );
            }
        }
    }

    /**
     * Display the chosen payment type on order totals table
     *
     * @param array    $total_rows
     * @param WC_Order $order
     * @param bool     $tax_display
     * @return array
     */
    public function display_transaction_type_order_item_totals( $total_rows, $order, $tax_display ){
        if( is_a( $order, 'WC_Order' ) && $order->get_meta('_transaction_type') ) {
            $new_rows = []; // Initializing
            $options  = $this->options;

            // Loop through order total lines
            foreach( $total_rows as $total_key => $total_values ) {
                $new_rows[$total_key] = $total_values;
                if( $total_key === 'payment_method' ) {
                    // Get transaction type array
                    if( $meta_data = $order->get_meta('_transaction_type') ) {
                        $new_rows['payment_type'] = [
                            'label' => __("Transaction type", $this->domain) . ':',
                            'value' => implode(',', $meta_data),
                        ];
                    }
                }
            }

            $total_rows = $new_rows;
        }
        return $total_rows;
    }
它应该更好地工作


相关帖子:

你在制造混乱,因为人们不会同时选择“Espèces”和“票餐厅”。所有字段都需要作为选项分组到一个字段中……事实上,在我的例子中,问题是人们可以选择Espèces和票餐厅以及chèque假期。他们可以混合使用这三种东西付款。否则我会让单选按钮,这对我来说会容易得多。但我会失去一个学习的机会。几乎在工作。。。唯一的问题是在后台,在订单上。有一个很大的php警告非法的偏移类型。我想是这样的:/***在订单编辑页面后端显示所选的付款类型**@param object$order*/公共函数Display\u payment\u type\u order\u edit\u pages$order{如果$this->id===$order->get_payment\u method&$order->get_meta''u transaction\u type'{$options=$this->options;echo'。'DéDétails du painement':'.$options[$order->get_meta''u transaction\u type'].

'}我不知道如何在注释中缩进代码。。。
    /**
     * Output the "payment type" fields in checkout.
     */
    public function payment_fields(){
        if ( $description = $this->get_description() ) {
            echo wpautop( wptexturize( $description ) );
        }

        woocommerce_form_field( 'transaction_type-1', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Espèces', $this->domain),
        ), '' );

        woocommerce_form_field( 'transaction_type-2', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Tickets restaurants', $this->domain),
        ), '' );

        woocommerce_form_field( 'transaction_type-3', array(
            'type'          => 'checkbox',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Chèques vacances', $this->domain),
        ), '' );

        $option_keys = array_keys($this->options);

        woocommerce_form_field( 'transaction_type-4', array(
            'type'          => 'radio',
            'class'         => array('transaction_type form-row-wide'),
            'label'         => __('Payment Information - Test', $this->domain),
            'options'       => $this->options,
        ), reset( $option_keys ) );
    }

    /**
     * Save the chosen payment type as order meta data.
     *
     * @param object $order
     * @param array $data
     */
    public function save_order_payment_type_meta_data( $order, $data ) {
        if ( $data['payment_method'] === $this->id ) {
            $meta_value = array(); // Initializing

            if ( isset($_POST['transaction_type-1']) ) {
                $meta_value[1] = __('Espèces', $this->domain);
            }

            if ( isset($_POST['transaction_type-2']) ) {
                $meta_value[2] = __('Tickets restaurants', $this->domain);
            }

            if ( isset($_POST['transaction_type-3']) ) {
                $meta_value[3] = __('Chèques vacances', $this->domain);
            }

            // Save transaction type (from fields 1 to 3) as an array
            if( sizeof($meta_value) > 0 ) {
                $order->update_meta_data('_transaction_type', $meta_value );
            }

            // Save transaction type test (from fields 4) as a string
            if ( isset($_POST['transaction_type-4']) ) {
                $order->update_meta_data('_transaction_type_test', esc_attr($_POST['transaction_type-4']) );
            }
        }
    }

    /**
     * Display the chosen payment type on order totals table
     *
     * @param array    $total_rows
     * @param WC_Order $order
     * @param bool     $tax_display
     * @return array
     */
    public function display_transaction_type_order_item_totals( $total_rows, $order, $tax_display ){
        if( is_a( $order, 'WC_Order' ) && $order->get_meta('_transaction_type') ) {
            $new_rows = []; // Initializing
            $options  = $this->options;

            // Loop through order total lines
            foreach( $total_rows as $total_key => $total_values ) {
                $new_rows[$total_key] = $total_values;
                if( $total_key === 'payment_method' ) {
                    // Get transaction type array
                    if( $meta_data = $order->get_meta('_transaction_type') ) {
                        $new_rows['payment_type'] = [
                            'label' => __("Transaction type", $this->domain) . ':',
                            'value' => implode(',', $meta_data),
                        ];
                    }
                }
            }

            $total_rows = $new_rows;
        }
        return $total_rows;
    }