Различных сниппетов для смены 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'а, а поэтому сильно лезть в нее не хочется - мало ли, что там при обновах поменяется? Неправильно это. Есть идеи, как сделать все-таки по уму?