Получение «идентификатора миниатюры» из термина последней категории продуктов в WooCommerce

Я пытаюсь прагматично добавить новое портфолио. Когда я добавляю новую категорию в WooCommerce.

Мой код:

function programmatically_create_post() {

$author_id = 1;
$taxonomy     = 'product_cat';
$orderby      = 'id';
$show_count   = 0;      // 1 for yes, 0 for no
$pad_counts   = 0;      // 1 for yes, 0 for no
$hierarchical = 1;      // 1 for yes, 0 for no
$title        = '';
$empty        = 0;

$args = array(
    'taxonomy'     => $taxonomy,
    'orderby'      => $orderby,
    'show_count'   => $show_count,
    'pad_counts'   => $pad_counts,
    'hierarchical' => $hierarchical,
    'title_li'     => $title,
    'hide_empty'   => $empty
);
$all_categories = get_categories( $args );
$lastCategory=end($all_categories);
$slug =$lastCategory->slug;
$title=$lastCategory->name;
$thumbnail_id= get_post_thumbnail_id($lastCategory->id );

// If the page doesn't already exist, then create it

if( null == get_page_by_title( $title ) ) {

// Set the post ID so that we know the post was created successfully

    $post_id = wp_insert_post(

        array(

            'post_author'   => $author_id,
            'post_name'   => $slug,
            'post_title'    => $title,
            'post_status'   => 'publish',
            'post_type'   => 'us_portfolio',
            'post_parent' =>11,
            'page_template' =>'custumcat.php',
            'post_slug'=> $slug

        )

    );


    update_post_meta($post_id, '_wp_page_template', 'custumcat.php' );
    update_post_meta( $post_id, '_thumbnail_id', $thumbnail_id );

// Otherwise, we'll stop

} else {

    // Arbitrarily use -2 to indicate that the page with the title already exists

    $post_id = -2;

} // end if
} // end programmatically_create_post


add_action('create_product_cat', 'programmatically_create_post', 10,2);

Я хочу установить миниатюру портфолио из миниатюры категории, и я использовал $thumbnail_id= get_post_thumbnail_id($lastCategory->id );для получения миниатюры категории.

После этого я использовал update_post_meta( $post_id, '_thumbnail_id', $thumbnail_id ); для установки миниатюры портфолио.

Но он ничего не устанавливает.

Как я могу это исправить?


person zeynab farzaneh    schedule 24.07.2017    source источник


Ответы (3)


Обновление 2.1

Я протестировал приведенный ниже код и получил правильный $thumbnail_id без ошибок:

$categories = get_categories( array(
    'taxonomy'     => 'product_cat',
    'orderby'      => 'id',
    'show_count'   => 0,
    'pad_counts'   => 0,
    'hierarchical' => 1,
    'title_li'     => '',
    'hide_empty'   => 0
) );

$last_cat = end($categories); // last category

$last_cat_term_id = $last_cat->term_id; // Value is

$thumbnail_id = get_woocommerce_term_meta( $last_cat_term_id, 'thumbnail_id', true );
echo 'Term ID is: ' . $last_cat_term_id . '<br>';
echo 'Thumbnail ID is: ' . $thumbnail_id;

Он отображает последнюю категорию (с этими данными, связанными с моими настройками категорий продуктов):

Term ID is: 48
Thumbnail ID is: 443

А вот и соответствующий скриншот таблицы БД wp_termmeta:

// Отображает 443 (правильный набор 'thumbnail_id' в таблице БД wp_termmeta)

Так что это проверено и работает.

На этот раз update_post_meta( $post_id, '_thumbnail_id', $thumbnail_id ); правильно установит значение.


Обновление 1:

Категории продуктов — это настраиваемая таксономия WordPress, в которой используется WP_terms

Это не работает, потому что $lastCategory->id не существует (и выводит нулевое значение):

$thumbnail_id= get_post_thumbnail_id($lastCategory->id );

Вместо этого вам нужно использовать $lastCategory->term_id, который будет работать с объектом WP_Term и get_woocommerce_term_meta() следующим образом:

$thumbnail_id= get_woocommerce_term_meta( $lastCategory->term_id, 'thumbnail_id', true );

WP_Term свойства объекта:

term_id 
name
slug
term_group
term_taxonomy_id
taxonomy
description 
parent
count

Связанный с термином категории продукта: WooCommerce получить эскиз атрибута - Плагин Variation Swatches and Photos

person LoicTheAztec    schedule 24.07.2017
comment
В phpstorme нарисуйте строку на get_woocommerce_term_meta, но она работает, и я получаю идентификатор эскиза, но он не устанавливается на странице портфолио. - person zeynab farzaneh; 24.07.2017
comment
но мой вопрос, почему он не устанавливается? Хорошо, я заканчиваю этот вопрос и спрашиваю еще раз, почему он не устанавливается. спасибо мистер - person zeynab farzaneh; 24.07.2017
comment
@zeynabfarzaneh Несколько советов по вашему новому вопросу: вам также следует добавить соответствующий код для шаблона custumcat.php (или ссылку на него) и некоторые дополнительные сведения об этом шаблоне. См.: Как создать минимальный, полный и проверяемый пример(вам не нужно отвечать на этот комментарий) - person LoicTheAztec; 24.07.2017

Прежде всего, категория продуктов WooCommerce — это taxonomy, а не post, поэтому вы не можете использовать для нее функцию get_post_thumbnail_id(). Вместо этого вы можете использовать что-то вроде этого:

$thumbnail_id = get_woocommerce_term_meta( $term_id, 'thumbnail_id', true );

Во-вторых, поскольку ваша функция programmatically_create_post является ловушкой для create_product_cat, при вызове она получает 2 параметра: $term_id и $term_taxonomy_id. Нет необходимости искать только что созданную категорию товаров по всем этим строкам (get_categories() даже не должна работать, потому что здесь вы работаете с категориями товаров, а не с обычными категориями сообщений):

$all_categories = get_categories( $args );
$lastCategory=end($all_categories);

когда вы можете просто объявить свою функцию как

function programmatically_create_post($term_id, $tt_id) {...}

затем просто используйте параметр $term_id:

$lastCategory = get_term($term_id, 'product_cat');

Убедитесь, что вы также используете $term_id вместо $lastCategory->id.

person Zoli Szabó    schedule 24.07.2017
comment
Я отредактировал свой код, как ты грустишь. но это не работает и не добавляет новую категорию - person zeynab farzaneh; 24.07.2017

get_woocommerce_term_meta устарел, начиная с версии 3.6. Вместо этого используйте get_term_meta.

get_term_meta( int $term_id, string $key = '', bool $single = false )

справочная документация Кодекса

person dj.cowan    schedule 21.06.2019