Skip Navigation

[Resolved] Mostrar IDs de campo para carga de imagenes con múltiples instancias

This support ticket is created 6 years, 11 months ago. There's a good chance that you are reading advice that it now obsolete.

This is the technical support forum for Toolset - a suite of plugins for developing WordPress sites without writing PHP.

Everyone can read this forum, but only Toolset clients can post in it. Toolset support works 6 days per week, 19 hours per day.

Sun Mon Tue Wed Thu Fri Sat
- 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 -
- 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 -

Supporter timezone: Europe/London (GMT+00:00)

This topic contains 6 replies, has 2 voices.

Last updated by Sabrina Martinez 6 years, 11 months ago.

Assisted by: Nigel.

Author
Posts
#596890

¿Qué intento hacer?

Estoy adaptando el custom post type "Proyects" de Divi, con grupos de campos personalizados, para generar una carga organizada de portfolios.

En cada item de portfolio, intento mostrar galerías de imágenes, utilizando una plantilla personalizada de Toolset.

He generado un grupo de campos, y dentro un campo (de múltiple instancia) de tipo imagen, para cargar las imágenes de las galerías.

Entonces, lo que necesito es poder obtener los IDs concatenados por coma, para usar el shortcode [gallery ids=''].

¿Alguna documentación que intento utilizar?

He buscado en varios hilos del foro de soporte, pero no me ha servido ninguna ayuda.

Entiendo que sería requerida una función, y actualmente he usando esta (pero no me sirve o no la sé aplicar el shortcode que devuelve):

function prefix_get_img_ids($atts) {
global $project;

$images = (array) get_post_meta($project->ID, 'wpcf-desarrollo-recursos', false); // cast to array in case there is only one item
$ids = array();

global $wpdb;

foreach($images as $img) {
$query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$img'";
$id = $wpdb->get_var($query);
$ids[] = $id;
}

return implode(",",$ids);
}
add_shortcode("get-image-ids", "prefix_get_img_ids");

¿Hay algún ejemplo similar que puedas ver?

No lo encontré.

¿Cuál es el enlace a mi sitio?

hidden link

#597080

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Hola Sabrina

Hay un problema fundamental con este enfoque: no se puede anidar shortcodes.

Este no funcionará:

add_shortcode( 'gallery-ids', function(){

	return "32,118,127,157";
});

>> [gallery ids="[gallery-ids]"]

Creo que tendrás que crear un shortcode particular para usar en lugar de [gallery], no como un atributo de [gallery].

Este shortcode debe coger los id's de las imagenes como ya lo tienes, y construir una cadena de texto que replica el shortcode "gallery" y entonces usar do_shortcode() para ejecutarlo (https://developer.wordpress.org/reference/functions/do_shortcode/).

Así:

...
$shortcode = "[gallery ids='" . implode(",",$ids) . "']";
$gallery = do_shortcode( $shortcode );

return $gallery;
...

¿Este hace sentido?

#597272

Creo que entiendo...

Igualmente, necesito que me indiques cual sería el código completo a incluir en functions, puesto que no puedo hacer funcionar ninguno.

He intentado con este tutorial, y me ha funcionado, pero no es lo que necesito en este caso:

https://toolset.com/2017/10/adding-a-gallery-of-images-for-custom-posts/

Lo que busco es, como bien dices, usar el shortcode [gallery] (propio de WordPress) dentro de la función para agrupar los IDs, para luego generar uno personalizado y usarlo en la plantilla.

#597518

Actualmente estoy empleando el código que compartiste en esta publicación:
https://toolset.com/forums/topic/create-wp-gallery-from-multiple-image-field/

Pero no sé qué colocar en $postid = $atts['postid']; ...

add_shortcode( 'galeria_prestaciones', function( $atts ){
 
    global $wpdb;
 
    $postid = $atts['postid'];
    $slug = 'wpcf-' . $atts['desarrollo-prestaciones'];
 
 
    // Retrieve image field urls
    $images = (array) get_post_meta( $postid, $slug, false);
 
    $ids = array();
    // Convert the urls to post ids for the images
    foreach ($images as $image) {
 
        $attachment = $wpdb->get_col( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image ) ); 
        $ids[] = $attachment[0];
    }
 
    $ids_list = join( ',', $ids );
 
    $gallery = '[gallery ids="' . $ids_list . '"]';
 
    $out = do_shortcode( $gallery );
 
    return $out;
});

Este código funciona, pero lo que devuelve son las imágenes que adjunto a la publicación del item de portfolio, pero no las que añado en el campos personalizado wpcf-desarrollo-prestaciones.

#597641

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Hola Sabrina

Veo que has modificado el código original y no sé si lo utilizas correctamente.

No es necesario cambiar nada del código original, menos el nombre del shortcode.

Entonces, con el nombre del shortcode tuyo sería así:

/**
 * Register shortcode gallery_from_image_fields
 * required attributes
 *   postid : the post id
 *   slug : the image field slug (no prefix)
 */
add_shortcode( 'galeria_prestaciones', function( $atts ){
 
    global $wpdb;
 
    $postid = $atts['postid'];
    $slug = 'wpcf-' . $atts['slug'];
 
 
    // Retrieve image field urls
    $images = (array) get_post_meta( $postid, $slug, false);
 
    $ids = array();
    // Convert the urls to post ids for the images
    foreach ($images as $image) {
 
        $attachment = $wpdb->get_col( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image ) ); 
        $ids[] = $attachment[0];
    }
 
    $ids_list = join( ',', $ids );
 
    $gallery = '[gallery ids="' . $ids_list . '"]';
 
    $out = do_shortcode( $gallery );
 
    return $out;
});

Se puede utilizar en una plantilla así:

[galeria_prestaciones  postid='[wpv-post-id]' slug='desarrollo-prestaciones']

Es decir, se mete el slug del campo de entrada como atributo del shortcode, no se cambia el código del mismo shortcode.

¿Puedes intentar de nuevo?

#597708

¡Gracias, Nigel! ¡Funcionó!

Pensé que habría que modificar "slug" por el slug del campo correspondiente según el bloque comentado encima del código.

Te pido disculpas por tantas idas y vueltas.

¡Saludos!

#598565

Buen día, Nigel.

Lamentablemente, creo que al parecer he confundido la respuesta de la aplicación de la función. Porque he visto que me mostraba la galería de imágenes, pero no del campo personalizado "desarrollo-prestaciones", sino de las imágenes adjuntas al post.

¿Es posible que te haga entrega de datos de acceso a la instalación del sitio para que revises qué está ocurriendo?

¡Saludos!