• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Вывод произвольных полей

alextwinner

Новичок
Создаю произвольное поле с помощью плагина Advanced Custom Fields https://www.advancedcustomfields.com/ (тоже дополнительное поле, только более удобное)

Объясните пож. как это поле теперь выводить в разных местах?
в карте
в корзине
в кабинете пользователя и д.р.

По документации выводится вроде все просто get_field() или the_field(). Но вывести не получается... Добавляю в сответсвующие файлы, например cart/cart.php в нужное место

<?php the_field('afflink_to_product'); ?>

Выодится пустота..

В function может что то добавлять еще нужно?

В php ноль почти... Поэтому если можно подробнее)
 
Последнее редактирование:

alextwinner

Новичок
понял, почему не выводится на странице корзины... Конечно, потому что не понятно к какому посту (товару) это поле относится.
вот тут дока на русском и примеры вывода http://acf.wp-book.ru/primery-koda/

Только как это применить в моем случае?
Вот кусок кода файла cart/cart.php . Тут выводится название товара и ссылка на него. А как сделать что бы выводилось мое произвольное поле

afflink_to_product ?

Код:
        <?php
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
            $_product     = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
            $product_id   = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );

            if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
                ?>
                <tr class="<?php echo esc_attr( apply_filters( 'woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) ); ?>">

                    <td class="product-remove">
                        <?php
                            echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf(
                                '<a href="%s" class="remove" title="%s" data-product_id="%s" data-product_sku="%s">&times;</a>',
                                esc_url( WC()->cart->get_remove_url( $cart_item_key ) ),
                                __( 'Remove this item', 'woocommerce' ),
                                esc_attr( $product_id ),
                                esc_attr( $_product->get_sku() )
                            ), $cart_item_key );
                        ?>
                    </td>
 

alextwinner

Новичок
подскажите еще плиз как будет правильно вот в таком куске кода вывести мое произвольное поле afflink_to_product
файл /woocommerce/templates/cart/cart.php
в этом куске выводится Название товара с сылкой на карточку товара
а мне нужно что бы вместо ссылки выводилось мое поле afflink_to_product
т.е. в html вот так <a href="afflink_to_product">%s</a>

PHP:
                    <td class="product-name" data-title="<?php _e( 'Product', 'woocommerce' ); ?>">
                        <?php
                            if ( ! $_product->is_visible() ) {
                                echo apply_filters( 'woocommerce_cart_item_name', $_product->get_title(), $cart_item, $cart_item_key ) . '&nbsp;';
                            } else {
                                echo apply_filters( 'woocommerce_cart_item_name', sprintf( '<a href="%s">%s</a>', esc_url( $_product->get_permalink( $cart_item ) ), $_product->get_title() ), $cart_item, $cart_item_key );
                            }

                            // Meta data
                            echo WC()->cart->get_item_data( $cart_item );

                            // Backorder notification
                            if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) ) {
                                echo '<p class="backorder_notification">' . esc_html__( 'Available on backorder', 'woocommerce' ) . '</p>';
                            }
                        ?>
                    </td>

и тоже самое вот в этом куске
файл woocommerce/templates/order/order-details-item.php

PHP:
    <td class="product-name">
        <?php
            $is_visible = $product && $product->is_visible();

            echo apply_filters( 'woocommerce_order_item_name', $is_visible ? sprintf( '<a href="%s">%s</a>', get_permalink( $item['product_id'] ), $item['name'] ) : $item['name'], $item, $is_visible );
            echo apply_filters( 'woocommerce_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '&times; %s', $item['qty'] ) . '</strong>', $item );

            do_action( 'woocommerce_order_item_meta_start', $item_id, $item, $order );

            $order->display_item_meta( $item );
            $order->display_item_downloads( $item );

            do_action( 'woocommerce_order_item_meta_end', $item_id, $item, $order );
        ?>
    </td>

п.с.
суть должна быть одна и та же для этих кусоков, поэтому можно на примере любого из них
 

alextwinner

Новичок
для карты - файл /woocommerce/templates/cart/cart.php (верхний код) вот такая конструкция сработала:

PHP:
$field = get_field('afflink_to_product',$product_id)

целиком

PHP:
                        <?php
                            if ( ! $_product->is_visible() ) {
                                echo apply_filters( 'woocommerce_cart_item_name', $_product->get_title(), $cart_item, $cart_item_key ) . '&nbsp;';
                            } else {
                                echo apply_filters( 'woocommerce_cart_item_name', sprintf( '<a href="%s">%s</a>', $field = get_field('afflink_to_product',$product_id), $_product->get_title() ), $cart_item, $cart_item_key );
                            }

                            // Meta data
                            echo WC()->cart->get_item_data( $cart_item );

                            // Backorder notification
                            if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) ) {
                                echo '<p class="backorder_notification">' . esc_html__( 'Available on backorder', 'woocommerce' ) . '</p>';
                            }
                        ?>

а для деталей заказа (после оформления) файл woocommerce/templates/order/order-details-item.php
так не работает!

PHP:
        <?php
            $is_visible = $product && $product->is_visible();

            echo apply_filters( 'woocommerce_order_item_name', $is_visible ? sprintf( '<a href="%s">%s</a>', $field = get_field('afflink_to_product',$product_id), $item['name'] ) : $item['name'], $item, $is_visible );
            echo apply_filters( 'woocommerce_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '&times; %s', $item['qty'] ) . '</strong>', $item );

            do_action( 'woocommerce_order_item_meta_start', $item_id, $item, $order );

            $order->display_item_meta( $item );
            $order->display_item_downloads( $item );

            do_action( 'woocommerce_order_item_meta_end', $item_id, $item, $order );
        ?>

срабатывает только если явно указать ID товара вместо $product_id

почему может не подгружаться ID?
 

vladimon96

Новичок
для карты - файл /woocommerce/templates/cart/cart.php (верхний код) вот такая конструкция сработала:

PHP:
$field = get_field('afflink_to_product',$product_id)

целиком

PHP:
                        <?php
                            if ( ! $_product->is_visible() ) {
                                echo apply_filters( 'woocommerce_cart_item_name', $_product->get_title(), $cart_item, $cart_item_key ) . '&nbsp;';
                            } else {
                                echo apply_filters( 'woocommerce_cart_item_name', sprintf( '<a href="%s">%s</a>', $field = get_field('afflink_to_product',$product_id), $_product->get_title() ), $cart_item, $cart_item_key );
                            }

                            // Meta data
                            echo WC()->cart->get_item_data( $cart_item );

                            // Backorder notification
                            if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) ) {
                                echo '<p class="backorder_notification">' . esc_html__( 'Available on backorder', 'woocommerce' ) . '</p>';
                            }
                        ?>

а для деталей заказа (после оформления) файл woocommerce/templates/order/order-details-item.php
так не работает!

PHP:
        <?php
            $is_visible = $product && $product->is_visible();

            echo apply_filters( 'woocommerce_order_item_name', $is_visible ? sprintf( '<a href="%s">%s</a>', $field = get_field('afflink_to_product',$product_id), $item['name'] ) : $item['name'], $item, $is_visible );
            echo apply_filters( 'woocommerce_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '&times; %s', $item['qty'] ) . '</strong>', $item );

            do_action( 'woocommerce_order_item_meta_start', $item_id, $item, $order );

            $order->display_item_meta( $item );
            $order->display_item_downloads( $item );

            do_action( 'woocommerce_order_item_meta_end', $item_id, $item, $order );
        ?>

срабатывает только если явно указать ID товара вместо $product_id

почему может не подгружаться ID?
Знаю, что прошло много времени, но я искал это сейчас и наткнулся на статью
Мне помогло следующее решение
<?php if(get_field('spicy_pizza', $cart_item['product_id'])):?>spicy_pizza<?php endif;?>
У меня было произвольное поле (Да/Нет ) поэтому код такой
Смысл в том, что перед product_id нужно указать $cart_item
____
В вашем случае скорее всего будет так:
get_field('afflink_to_product', $cart_item['product_id'])
 
Сверху Снизу