Проверьте тип сообщения в пользовательском поиске, чтобы получить атрибуты продукта Woocommerce - PullRequest
0 голосов
/ 21 декабря 2018

Я внедряю сайт woocommerce.Здесь я предоставляю строку поиска для поиска только товаров.

<form action="<?php echo get_site_url() ?>" method="GET">
    <div class="input-group">
         <input type="search" name="s" class="form-control" placeholder="Search Products" required>
         <input type="hidden" name="post_type" value="products" />
         <div class="input-group-btn">
             <button class="btn btn-default" type="submit">
                <i class="fa fa-search" aria-hidden="true"></i>
             </button>
         </div>
    </div>
</form>

Результат поиска по коду приведен на странице single-product.На боковой панели страницы одного продукта у меня есть раздел, который показывает product attributes и attribute terms.

. Следующий код предназначен для получения доступных размеров продукта на текущей странице (product-single)

*.1011 *

Это html, где я печатаю их в HTML-DOM,

<ul class="w-woo-inner-box">

  <?php $sizes = getaSizes();
      if(!empty($sizes)):
         foreach ($sizes as $key => $size) { ?>
          <li>
            <label class="checkbox inline-block <?php echo checkurlactive($size['attribute'], $size['term_id']); ?>">
                                  <a href="<?php echo generate_filter_url($size['attribute'], $size['term_id']) ?>">
                                    <input type="checkbox" class="">
                                    <label>&nbsp;</label>
            <span><?php echo $size['size']; ?></span>
            </a>
            </label>
          </li>
        <?php }
       else: ?>
            <li class="no-val-found"><span>No sizes found!</span> </li>
    <?php endif; ?>
</ul>

ПРОБЛЕМА: Это было огромное описание.Хорошо, теперь давайте посмотрим на проблему, из приведенного выше кода, когда я ищу existing product name, он работает нормально.Но когда я ищу некоторые значения из other post types На странице есть php error с упоминанием

Fatal error: Call to a member function get_attributes() on boolean in /..../functions.php on line 482

И я попытался отладить его и обнаружил, что следующий цикл в getSizes() возвращает другой post type values,

if ( have_posts() ) :
 while ( have_posts() ) : the_post();

В чем здесь проблема?Как я могу избежать поиска другого post type values?

1 Ответ

0 голосов
/ 21 декабря 2018

В вашем коде функции вы должны проверить тип сообщения перед тем, как внутри цикла, например:

if ( have_posts() ) :
    while ( have_posts() ) : the_post();

        // Check for "product" post type or continue
        if( 'product' !== get_post_type() ) {
            continue; // jump to next product

        echo get_the_title();

        // Get an instance of the WC_Product Object
        $product = wc_get_product( get_the_id() );

Это позволит избежать ошибки, которую вы получите , так как $product будетвсегда быть WC_Product объектом.


Бонусное добавление:

Теперь метод WC_Product get_attributes()имеет один аргумент $context, который может иметь 2 значения:

  • 'view' (значение по умолчанию)
  • 'edit' (для использования в бэкэнде)

Но НЕ: $attributes = $product -> get_attributes('size');

Поэтому, если вы хотите получить определенный атрибут, вы будете использовать WC_Product метод get_attribute() целое число, которое дает разделенную запятыми строку имен терминов, таких как:

        // Get an instance of the WC_Product Object
        $product = wc_get_product( get_the_id() );

        // Loop through 'size' product attribute
        $size_values = $product->get_attribute('size');

        // Convert to an array of term names
        $term_names = (array) explode(', ', $size_values);

        // The product attribute taxonomy (always start with "pa_" + the slug)
        $taxonomy = 'pa_size';

        // Loop through term names
        foreach( $term_names as $term_name ) {
            // Get the WP_Term object (if needed)
            $term = get_term_by( 'name', $term_name, $taxonomy );

            $term_id   = $term->term_id;
            $term_slug = $term->slug;
        }
...