Cum să creezi shortcode-uri personalizate în Visual Composer cu vc_map() pentru imagini
Folosesc plugin-ul Visual Composer într-o temă pe care o dezvolt. Întrebarea mea este despre maparea shortcode-urilor la array-uri în Visual Composer.
Problema apare când încerc să creez un element personalizat pentru o imagine. Iată ce am făcut:
Am creat un fișier PHP vc_shortcodes.php
pentru array-urile mele de parametri. Shortcode-urile corespunzătoare sunt în functions.php
.
Pentru tipul de array textarea_html
totul funcționează corect și văd textul așa cum trebuie în frontend.
Acum încerc să folosesc un array cu tipul attach_image
. Acesta este următorul:
// Imagine
add_action( 'vc_before_init', 'webnuts_bild' );
function webnuts_bild() {
vc_map( array(
"name" => __( "Imagine", "my-text-domain" ),
"base" => "image_url",
"icon" => "icon-webnuts",
'admin_enqueue_css' => array('/wp-content/themes/devdmbootstrap3-child/framework/css/admin-wn.css' ),
"class" => "wn-bild",
"category" => __( "Conținut", "my-text-domain"),
"params" => array(
array(
"type" => "attach_image",
"holder" => "img",
"class" => "",
"heading" => __( "Imagine de fundal", "my-text-domain" ),
"param_name" => "image_url",
"value" => __( "", "my-text-domain" ),
"description" => __( "Te rog selectează sau încarcă o imagine aici", "my-text-domain" )
)
)
) );
}
Funcționează până acum în sensul că pot selecta elementul în backend și atașa o imagine. Dar cred că fac ceva greșit în functions.php.
Sunt sigur că greșesc ceva în functions.php
... Aici folosesc următoarele:
add_shortcode( 'image_url', 'bild_func' );
function bild_func( $atts ) {
extract( shortcode_atts( array(
'image_url' => 'Imaginea nu este afișată corect'
), $atts ) );
return "<div class='bild-wrapper'><img src='" . "{$image_url}" . "'/></div>";
}
Iată ce este returnat în browser:
<div class="bild-wrapper">
<img src="9">
</div>
Ce trebuie să modific ca imaginea să fie afișată corect în browser?
Visual Composer adaugă ID-ul imaginii în shortcode-ul generat. Acest lucru vă oferă mai multă flexibilitate cu dimensiunile imaginilor. Puteți folosi astfel:
$imageSrc = wp_get_attachment_image_src($image_url, 'thumbnail');
if( $imageSrc ) {
echo '<img src="' . $imageSrc[0] . '" />';
}
Parametrul thumbnail
poate fi înlocuit cu medium
sau altă dimensiune validă a imaginii. Condiția if
este acolo pentru a verifica dacă imaginea există cu adevărat (nu a fost ștearsă).
Sfat: Redenumiți param_name
în image_id
pentru a evita confuzia când utilizați codul mai târziu.
Sursa: https://developer.wordpress.org/reference/functions/wp_get_attachment_image_src/

Folosește URL-ul imaginii prin ID-ul de atașament care este deja afișat. Deci folosește wp_get_attachment_image_src
pentru a obține URL-ul atașamentului. Ca în exemplul următor:
add_shortcode( 'image_url', 'bild_func' );
function bild_func( $atts ) {
extract( shortcode_atts( array(
'image_url' => ''
), $atts ) );
/* Obținem URL-ul din acea imagine */
if(isset($a['image_url'])) {
$image_url = wp_get_attachment_image_src( $a['image_url'], 'full' );;
} else {
$image_url = ''; // imagine implicită sau altceva dacă dorești.
}
return "<div class='bild-wrapper'><img src='" . "{$image_url[0]}" . "'/></div>";
}
Sper că este clar!

Visual Composer face lucrurile corect prin furnizarea ID-ului imaginii, deoarece astfel poți obține imaginea în dimensiunea optimă pentru nevoile tale. Ai putea face astfel:
// Înlocuiește 'thumbnail' cu orice dimensiune validă de imagine din WordPress.
$imageSrc = wp_get_attachment_image_src($image_url, 'thumbnail');
// Verifică dacă imaginea există în continuare
if( $imageSrc ) {
echo '<img src="' . $imageSrc[0] . '" />';
}
De asemenea, ai putea redenumi 'param_name' în 'vc_map' în 'image_id' pentru a înțelege mai ușor codul mai târziu.
