Ad
Create Function To Display An Image Or Placeholder Image For A Single Product
I am looking to create a function that would allow me to display an image with the "slug name" of the product, but only if this image is present in the folder, and which displays a placeholder image if this image does not exist !
Here is my current code:
function custom_hero_image( $post_id ) {
$product = get_post( $post_id );
$slug = $product->post_name;
if ( is_product( $post_id ) ) {
if ( has_post_thumbnail() ) {
$html = '<img class="jarallax-img" src="'. get_template_directory_uri() .'/inc/assets/img/shop/hero/'.$slug.'_hero.jpg">';
}
} else {
$html = '<img class="jarallax-img" src="'. get_template_directory_uri() .'/inc/assets/img/hero/shop-hero.jpg">';
}
return $html;
}
And this is the code for the single-product.php file
<?php
// get the post ID outside the Loop
$post_id = get_queried_object_id();
// print the <img>
echo custom_hero_image( $post_id );
?>
In this code, the image is well displayed when it exists but when there is no image to display, the placeholder image is not displayed!
Could you help me and tell me where is my mistake?
Let me know if you have any questions.
Ad
Answer
you can just simply use onerror
attribute on the image tag, this will fired if the image cannot be accessed, or use file_exists
function to determine if the image is exists,
Simple ways:
function custom_hero_image( $post_id ) {
$product = get_post( $post_id );
$slug = $product->post_name;
// Rearrange the script to better readibility:
$placeholder_image = get_template_directory_uri() .'/inc/assets/img/hero/shop-hero.jpg';
$slug_image = get_template_directory_uri() .'/inc/assets/img/shop/hero/'.$slug.'_hero.jpg';
// Build the image tag
$html = '<img class="jarallax-img" src="'. $slug_image . '" onerror="this.onerror=null;this.src=`'. $placeholder_image .' `">';
// Explanation:
// - onerror="this.onerror=null;this.src=`'. $placeholder_image .' `";
// ^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// (1) (2) (3)
//
// 1. Add `onerror` handle which will be fired if the image (`slug_image`)
// cannot be accessed,
// 2. Set `this.onerror` to null which will remove (assign the handler to null)
// the halder because if the `placeholder_image` is also not accessible,
// there will not causing infinity loop of `onerror`
// 3. Set current source (`src` tag) to `placeholder_image`
return $html;
}
Using file_exists
:
function custom_hero_image( $post_id ) {
$product = get_post( $post_id );
$slug = $product->post_name;
// Change the if Condition
// Change the position to here, instead of nested `if-else`
// vvvvvvvvvvvvvvvvvvvvvvvv
if ( is_product( $post_id ) && has_post_thumbnail() ) {
$html = '<img class="jarallax-img" src="'. get_template_directory_uri() .'/inc/assets/img/shop/hero/'.$slug.'_hero.jpg">';
} else {
$html = '<img class="jarallax-img" src="'. get_template_directory_uri() .'/inc/assets/img/hero/shop-hero.jpg">';
}
return $html;
}
Ad
source: stackoverflow.com
Related Questions
- → "failed to open stream" error when executing "migrate:make"
- → October CMS Plugin Routes.php not registering
- → OctoberCMS Migrate Table
- → OctoberCMS Rain User plugin not working or redirecting
- → October CMS Custom Mail Layout
- → October CMS - How to correctly route
- → October CMS create a multi select Form field
- → October CMS - Conditionally Load a Different Page
- → How to disable assets combining on development in OctoberCMS
- → October CMS - Radio Button Ajax Click Twice in a Row Causes Content to disappear
- → OctoberCms component: How to display all ID(items) instead of sorting only one ID?
- → In OctoberCMS how do you find the hint path?
- → How to register middlewares in OctoberCMS plugin?
Ad