WordPress: заполнить поле списка продуктами WooCommerce в Gravity Forms - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу позволить пользователям выбирать товары в форме. Для этого мне нужно динамически заполнить форму опубликованными продуктами WooCommerce.

Я нашел решение для заполнения поля выбора продуктами WooCommerce. Но пользователь должен иметь возможность выбрать количество для каждого продукта. Поэтому мне нужно использовать поле списка и заполнить ячейки поля списка.

Вот как выглядит поле списка:

enter image description here

SKU и поля заголовка должны заполняться динамически. И поле количества должно быть заполнено пользователем.

Вот мой код для заполнения поля выбора данными продукта WooCommerce:

add_filter( 'gform_pre_render_5', 'populate_posts' );
add_filter( 'gform_pre_validation_5', 'populate_posts' );
add_filter( 'gform_pre_submission_filter_5', 'populate_posts' );
add_filter( 'gform_admin_pre_render_5', 'populate_posts' );
function populate_posts( $form ) {

    foreach ( $form['fields'] as &$field ) {

        if ( $field->type != 'select' || strpos( $field->cssClass, 'populate-posts' ) === false ) {
            continue;
        }

        // you can add additional parameters here to alter the posts that are retrieved
        // more info: http://codex.wordpress.org/Template_Tags/get_posts
        $posts = get_posts( 'numberposts=-1&post_status=publish&post_type=product' );

        $choices = array();

        foreach ( $posts as $post ) {
            $choices[] = array( 'text' => $post->post_title, 'value' => $post->post_title );
        }

        // update 'Select a Post' to whatever you'd like the instructive option to be
        $field->placeholder = 'Select a product';
        $field->choices = $choices;

    }

    return $form;
}

К сожалению, я не знаю, как заполнить ячейки поле списка динамически.

Я нашел пример заполнения поля списка: https://docs.gravityforms.com/gform_field_value_parameter_name/#list -field

Но я не мог понять, как объединить эти поля два фрагмента: /

add_filter( 'gform_field_value_list', 'populate_list' );
function populate_list( $value ) {
  $list_array = array(
            array(
                'Column 1' => 'row1col1',
                'Column 2' => 'row1col2',
                'Column 3' => 'row1col3',
            ),
            array(
                'Column 1' => 'row2col1',
                'Column 2' => 'row2col2',
                'Column 3' => 'row2col3'
            ),
  );
    return $list_array;
}

1 Ответ

0 голосов
/ 08 апреля 2020

Если кому-то интересно, вот мой рабочий код.

С некоторой большой помощью отсюда: { ссылка }

add_filter( 'gform_field_value_list', 'populate_list' );
function populate_list( $value ) {

    global $current_user;
    get_currentuserinfo();

    $statuses = array('publish', 'draft');

    // Args on the main query for WC_Product_Query
    $args = [
        'status'    => $statuses,
        'orderby'   => 'name',
        'order'     => 'ASC',
        'limit'     => -1,
    ];

    $vendor_products = wc_get_products($args);

    $list_array = array();

    foreach ($vendor_products as $key => $product) {

        if ($product->get_type() == "variable") {

            // Args on product variations query for a variable product using a WP_Query
            $args2 = array( 
                'post_parent' => $product->get_id(), 
                'post_type'   => 'product_variation', 
                'orderby'     => array( 'menu_order' => 'ASC', 'ID' => 'ASC' ), 
                'fields'      => 'ids', 
                'post_status' => $statuses, 
                'numberposts' => -1, 
            ); 

            foreach ( get_posts( $args2 ) as $child_id ) {
                // get an instance of the WC_Variation_product Object
                $variation = wc_get_product( $child_id ); 

                if ( ! $variation || ! $variation->exists() ) {
                    continue;
                }

                $list_array[] = array(
                    'SKU'      => $variation->get_sku(),
                    'Name'     => $product->get_name() . " - " . $child_id,
                );
            }

        } else {

            $list_array[] = array(
                'SKU'      => $product->get_sku(),
                'Name'     => $product->get_name(),
            );

        }

    }

    return $list_array;

}
...