añadidoencantador
Tengo una página que tiene una presentación de diapositivas en la parte superior e imágenes insertadas en línea en el área de contenido.
Necesito excluir las imágenes que se han insertado en la publicación de la presentación de diapositivas.
Actualmente estoy excluyendo la ‘Imagen destacada’, pero esto me limita a una imagen que se puede insertar en la publicación.
Aquí está mi código existente:
$thumbnail = get_post_thumbnail_id();
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent=".$post->ID ."&exclude=".$thumbnail);
Anteriormente, usé el campo de descripción de los metadatos de la imagen para excluir imágenes ingresando “excluir”. Esto no es tan bueno para el usuario final como me gustaría que fuera.
¡Cualquier sugerencia, complemento o código basado!
Actualizar:
Actualicé el código, así que ahora obtengo cualquier URL de imagen de post_content y las comparo con las imágenes de la presentación de diapositivas.
$content = $post->post_content;
$inlineImages = array();
preg_match( '/src="https://stackoverflow.com/questions/8696206/([^"]*)"/i', $content, $inlineImages ) ;
$thumbnail = get_post_thumbnail_id($post->ID);
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent=".$post->ID ."&exclude=".$thumbnail);
if ($images) {
echo "<div id="slideshow">';
foreach ( $images as $attachment_id => $attachment ) {
$image = wp_get_attachment_image_src( $attachment_id,array(900,265));
if (!in_array($image[0],$inlineImages)) {
echo '<img src="'.$image[0].'" width="'. $image[1] .'" height="'. $image[2].'">';
}
}
echo '</div>';
}
Esta es una buena solución, aunque la expresión regular podría mejorarse.
Un mejor paso sería agregar la matriz de imágenes a un campo de campo personalizado, que se actualiza en la actualización o publicación de la publicación/página.
¿Alguna sugerencia sobre cómo hacer esto?
Solo necesitaba hacer lo mismo. Su enfoque original es la forma en que quería hacerlo: simplemente excluya cualquier imagen que se haya insertado en la publicación para que no aparezca en el control deslizante. Pero no quería que el cliente tuviera que hacer nada especial para que esto sucediera. Aquí está mi código.
$args = array( 'post_type' => 'attachment', 'post_mime_type'=>'image','numberposts' => -1, 'post_status' => null, 'post_parent' => $post->ID );
$attachments = get_posts($args);
preg_match_all("/<img[^']*?src=\"https://stackoverflow.com/questions/8696206/([^"]*?)\"[^']*?>/", $post->post_content, $matches, PREG_PATTERN_ORDER);
/* $matches[1] holds the urls as an array */
foreach ( $attachments as $attachment ) {
if(in_array($attachment->guid, $matches[1])){ continue;}
wp_get_attachment_image( $attachment->ID , 'slider_size');
}
El primer bit obtiene todas las imágenes asociadas con la publicación. El $preg_match_all obtiene todas las imágenes en el cuerpo de la publicación. Luego, a medida que recorremos las imágenes para mostrarlas en el control deslizante, in_array verifica las URL de las imágenes que se insertaron con la URL de la imagen que se agregará al control deslizante y salta a la siguiente si hay una coincidencia.
Gracias por tu publicación, me hizo pensar en la dirección correcta.
-
¡Buen método! Es posible que esto solo se aplique a los últimos
WP
versiones pero encuentro que el$attachment->guid
y el valor en el$matches
Array
no coinciden, ya que la imagen insertada en la publicación tendría el tamaño de la imagen agregado al final del nombre del archivo. Mi solución rápida es seleccionarSize
completo al insertar la imagen sin el tamaño de archivo adicional o editarla en la publicación, ambas no son excelentes soluciones.– Arroz moreno
2 de marzo de 2015 a las 12:36
Actualicé el código, así que ahora obtengo cualquier URL de imagen de post_content y las comparo con las imágenes de la presentación de diapositivas.
$content = $post->post_content;
$inlineImages = array();
preg_match( '/src="https://stackoverflow.com/questions/8696206/([^"]*)"/i', $content, $inlineImages ) ;
$thumbnail = get_post_thumbnail_id($post->ID);
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent=".$post->ID ."&exclude=".$thumbnail);
if ($images) {
echo "<div id="slideshow">';
foreach ( $images as $attachment_id => $attachment ) {
$image = wp_get_attachment_image_src( $attachment_id,array(900,265));
if (!in_array($image[0],$inlineImages)) {
echo '<img src="'.$image[0].'" width="'. $image[1] .'" height="'. $image[2].'">';
}
}
echo '</div>';
}
Creo que lo más fácil sería usar el complemento Meteor Slideshow para crear una presentación de diapositivas para cada página, luego insertar el código abreviado para la presentación de diapositivas adecuada en el área de contenido de la página adecuada. Sí, significa que tendrá que editar cada página “fuera” del editor de páginas, pero también le brinda un control fácil y completo sobre qué fotos aparecen y qué no aparecen en cada presentación de diapositivas, y el shortcode es muy fácil de usar. el redactor de la página.
Aquí hay otro enfoque para esto.
no preferiría usar direcciones URL, porque la imagen insertada dentro del área de contenido podría tener un tamaño diferente, como medio, miniatura o completo. Entonces, la URL solo no coincidiría.
Usando el código anterior,
function printMeImages() {
$content = $post->post_content;
$inlineImages = array();
// populate ids of images from wp-image-id
preg_match_all( '/wp-image-([^"]*)"/i', $content, $inlineImages ) ;
$thumbnail = get_post_thumbnail_id($post->ID);
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent=".$post->ID ."&exclude=".$thumbnail);
$out = "";
if ($images) {
$out .= "<ul id="slideshow">';
foreach ( $images as $attachment_id => $attachment ) {
$image = wp_get_attachment_image_src( $attachment_id,'desiredImageSize');
// $inlineImages[1] has ids to be discarded
if (!in_array($attachment_id,$inlineImages[1])) {
$out .= '<li><img src="'.$image[0].'" width="'. $image[1] .'" height="'. $image[2].'"></li>';
}
}
$out .= '</ul>';
}
return $out;
}
Se recuperan las imágenes que no están configuradas como destacadas y que no se usan dentro de la publicación.
Por razones de rendimiento, no ejecutaría el código mientras se procesa la página, sino que vincularía el código al gancho save_post. Cuando se edita y guarda el contenido de la publicación, se llamará al gancho y todas las imágenes adjuntas (o sus ID) que no se usan en el contenido se guardarán en una metatabla de publicación. Cuando se representa el control deslizante, se puede acceder a los identificadores de imagen a través de get_post_meta($post_id, ‘image_ids_for_slider’). De esta manera, puedo evitar hacer la operación preg_match_all en la representación de la página. Puede que esto no sea un motivo de rendimiento cuando el contenido de la publicación es pequeño y cuando solo hay un control deslizante cargado, pero en general encuentro que este es un enfoque un poco más limpio por razones de escala.
//hook this function to save post action
function save_ids_of_image_attachments_not_used_in_the_content( $post_id, $post ) {
$args = array( 'post_type' => 'attachment',
'post_mime_type'=>'image',
'numberposts' => -1,
'post_status' => null,
'post_parent' => $post_id
);
$attachments = get_posts($args);
preg_match_all("/<img[^']*?src=\"https://stackoverflow.com/questions/8696206/([^"]*?)\"[^']*?>/", $post->post_content, $matches, PREG_PATTERN_ORDER);
$ids_of_attached_images_not_in_content = array();
/* $matches[1] holds the urls as an array */
foreach ( $attachments as $attachment ) {
if(in_array($attachment->guid, $matches[1])){
continue;
}
$ids_of_attached_images_not_in_content[] = $attachment->ID;
}
// save the image_ids as postmeta
update_post_meta($post_id, 'image_ids_for_slider', $ids_of_attached_images_not_in_content);
}
add_action( 'save_post', 'save_ids_of_image_attachments_not_used_in_the_content', 10, 2 );
JD009
No he entendido completamente su problema, pero ¿qué hay de excluir la ID de div dentro de la cual está presente la presentación de diapositivas?
$thumbnail = get_post_thumbnail_id();
$images = get_children('post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent=".$post->ID ."&exclude=".$thumbnail. "&NAME');
Reemplace ‘NOMBRE’ después de la miniatura.’ en paréntesis. Espero que esto ayude.
¿Está adjuntando manualmente imágenes de presentación de diapositivas a la página a través del menú multimedia de administración?
– calebdas
11 de enero de 2012 a las 1:01