• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

Поменять placeholder вместо картинок для категорий

Image CMS

Stork.71

Гуру
Местный
#1
Когда мы не подгружаем для товаров или категорий картинки-миниатюры, вместо них выводится замещающее изображение - placeholder. Тут 2 вопроса:

1. Необходимо поменять это изображение в целом. Очевидно конечно, что можно подменить картинку ...\wp-content\plugins\woocommerce\assets\images\placeholder.png . Но такое изменение - одноразовое, до первой обновы. Хочется залить свой plsceholder в дочернюю тему и прописать ссылку на него. Только как это сделать?

2. Как поменять placeholder только для категорий, то есть грубо говоря сделать, чтобы у меня на сайте было 2 разных placeholder'а: один вылазит когда нет картинки товара, а другой - когда нет картинки категории. (я в принципе даже подумываю не делать отдельных картинок для категорий, а обозначить их просто какой-то общей абстрактной картинкой)
 

-Vladislav-

Опытный
Местный
#2
Док для смены placeholder
https://docs.woothemes.com/document/change-the-placeholder-image/
Это для категорий
PHP:
add_action( 'init', 'custom_placeholder' );
function custom_placeholder() {
if ( is_product_category() ){
add_filter('woocommerce_placeholder_img_src','custom_placeholder_img');

    function custom_placeholder_img($src) {
    $upload_dir = wp_upload_dir();
    $uploads = untrailingslashit( $upload_dir['baseurl'] );
    $src = $uploads . '/your/directory/custom_placeholder.jpg';
    return $src;
    }
  }
}
 

Stork.71

Гуру
Местный
#3
Ага, я ж дурак сразу не полез на англоязычных ресурсах искать :) Уже нашел этот и еще кучу вариантов. Завтра перепробую - поотписываюсь. :)
 

Stork.71

Гуру
Местный
#4
Различных сниппетов для смены placeholder'а можно найти много.

Прежде всего - родной сниппет из доков woo. Картинку надо заливать в родную папку uploads (или прятать глубже вручную, или через стандартную галерею) wordpress'а.
PHP:
/*
* goes in theme functions.php or a custom plugin. Replace the image filename/path with your own :)
*
**/
add_action( 'init', 'custom_fix_thumbnail' );
function custom_fix_thumbnail() {
  add_filter('woocommerce_placeholder_img_src', 'custom_woocommerce_placeholder_img_src');
   
    function custom_woocommerce_placeholder_img_src( $src ) {
    $upload_dir = wp_upload_dir();
    $uploads = untrailingslashit( $upload_dir['baseurl'] );
    $src = $uploads . '/2012/07/thumb1.jpg';
     
    return $src;
    }
}
Дальше - еще один красивый вариант, где вместо пути к картинке подставляется ID картинки (можно посмотреть в галерее в админке).
PHP:
//Change the placeholder image in WooCommerce
add_action( 'init', 'ccw_custom_woo_placeholder' );
function ccw_custom_woo_placeholder(){
    add_filter('woocommerce_placeholder_img_src','ccw_custom_placeholder_callback');
    function ccw_custom_placeholder_callback($src){
        $src = wp_get_attachment_url(121);
        return $src;
    }
}
Если надо ввести любой произвольный URL, не привязываясь к галерее, то есть такой вот сниппет. Почему-то здесь фильтр не повесили на 'init', но нам важно увидеть принцип и сделать по аналогии. Вероятно, код просто не захочет работать при вызове из дочерних тем.

PHP:
// Add action to hook into the approp
add_filter( 'woocommerce_placeholder_img_src', 'growdev_custom_woocommerce_placeholder', 10 );
/**
* Function to return new placeholder image URL.
*/
function growdev_custom_woocommerce_placeholder( $image_url ) {
  $image_url = 'http://wc23.co/wp-content/uploads/2015/08/placeholder.png';  // change this to the URL to your custom placeholder
  return $image_url;
}
Я же решил сделать немного по-своему. Считаю, что placeholder должен не теряться среди кучи залитых фоток в галерею, а лежать где-то отдельно со служебными картинками в теме, а точнее - в дочерней теме. Поэтому и код сделал под размещение в папке .../дочерняя тема/images.
PHP:
/** Меняем placeholder (замещающую картинку) для товаров **/

add_action( 'init', 'custom_placeholder' );
function custom_placeholder() {
 
add_filter('woocommerce_placeholder_img_src','custom_placeholder_img');

    function custom_placeholder_img($src) {
    $src = get_stylesheet_directory_uri() . '/images/placeholder.jpg';
    return $src;
   
   }
}

Дальше перешел к более интересному - замена placeholder'a для категорий. Код, найденный на просторах интернета (или в этой теме во 2 посте) не заработал. Почему - не знаю. Может, у меня старая версия woocommerce (2.2.10)? Если есть возможность, опробуйте его кто-нибудь на новой версии WC! А может он просто... неправильный и не должен был заработать? Продублирую сюда:
PHP:
 add_action( 'init', 'custom_placeholder' );
function custom_placeholder() {
if ( is_product_category() ){
add_filter('woocommerce_placeholder_img_src','custom_placeholder_img');

    function custom_placeholder_img($src) {
    $upload_dir = wp_upload_dir();
    $uploads = untrailingslashit( $upload_dir['baseurl'] );
    $src = $uploads . '/your/directory/custom_placeholder.jpg';
    return $src;
    }
  }
}
Попробовал сделать немного по-другому. Но в результате ВСЕ картинки, которые видны на страничке категории, отображаются с новым placeholder'ом (и картинки подкатегорий, и картинки товаров), а когда открываешь товар, то там остается старый дефолтный плейсхолдер. В общем, if ( is_product_category() не работает, или работает не так, как нам надо.
PHP:
 add_action( 'init', 'custom_placeholder' );
function custom_placeholder() {

add_filter('woocommerce_placeholder_img_src','custom_placeholder_img');

    function custom_placeholder_img($src) {
    if ( is_product_category() ){
    $upload_dir = wp_upload_dir();
    $uploads = untrailingslashit( $upload_dir['baseurl'] );
    $src = $uploads . '/images/placeholder-cat.jpg';
    }
    return $src;
   
  }
}
Пришлось поступить грубо. Просто переписать функцию, отвечающую за вывод картинки в категориях, заменив в ней пару слов. Получилось так:
PHP:
/** Меняем placeholder (замещающую картинку) для категорий (переписываем родную функцию, не лучшее решение) **/

function woocommerce_subcategory_thumbnail( $category ) {
    $small_thumbnail_size      = apply_filters( 'single_product_small_thumbnail_size', 'shop_catalog' );
    $dimensions                = wc_get_image_size( $small_thumbnail_size );
    $thumbnail_id              = get_woocommerce_term_meta( $category->term_id, 'thumbnail_id', true  );

    if ( $thumbnail_id ) {
        $image = wp_get_attachment_image_src( $thumbnail_id, $small_thumbnail_size  );
        $image = $image[0];
    } else {
        $image = get_stylesheet_directory_uri() . '/images/placeholder-cat.jpg';

    }
        if ( $image ) {
        // Prevent esc_url from breaking spaces in urls for image embeds
        // Ref: http://core.trac.wordpress.org/ticket/23605
        $image = str_replace( ' ', '%20', $image );

        echo '<img src="' . esc_url( $image ) . '" alt="' . esc_attr( $category->name ) . '" width="' . esc_attr( $dimensions['width'] ) . '" height="' . esc_attr( $dimensions['height'] ) . '" />';
    }
}
Данная функция (woocommerce_subcategory_thumbnail) отвечает в целом за вывод картинки, а не только placeholder'а, а поэтому сильно лезть в нее не хочется - мало ли, что там при обновах поменяется? Неправильно это. Есть идеи, как сделать все-таки по уму?