web-dev-qa-db-fra.com

Relier la galerie Wordpress à des catégories personnalisées (taxonomie)

Je souhaite utiliser la galerie Wordpress pour afficher toutes les images d'une catégorie dans une galerie (sur une page fixe), que je n'ai pas à mettre à jour en permanence en insérant les images manuellement.

J'ai donc ajouté la fonctionnalité de catégorie dans les médias avec cette fonction:

function is_add_categories_to_attachments() {
register_taxonomy_for_object_type( 'category', 'attachment' );
}
add_action( 'init' , 'is_add_categories_to_attachments' );

Génial, ça a fonctionné. Dans le menu Médias, je peux ajouter autant de catégories que je veux maintenant. Dans mon cas, j'en ai fabriqué trois, nommés alpha, bêta et gamma.

Ensuite, j'ai voulu poster une galerie sur une page fixe avec une catégorie:

[gallery type="squares" category="alpha" order="DESC" orderby="ID" link="file"]

Mais cela n'a pas fonctionné et j'ai dû utiliser le filtre post_gallery dans le functions.php de mon enfant, pour pouvoir changer le code ici, mais je ne sais absolument PAS comment entrer la reconnaissance de catégorie dans cette gallery_shortcut:

function is_gallery($output, $attr) {
$post = get_post();

static $instance = 0;
$instance++;

if ( ! empty( $attr['ids'] ) ) {
    // 'ids' is explicitly ordered, unless you specify otherwise.
    if ( empty( $attr['orderby'] ) )
        $attr['orderby'] = 'post__in';
    $attr['include'] = $attr['ids'];
}

// Allow plugins/themes to override the default gallery template.
$output = apply_filters('post_gallery', '', $attr);
if ( $output != '' )
    return $output;

// We're trusting author input, so let's at least make sure it looks like a valid orderby statement
if ( isset( $attr['orderby'] ) ) {
    $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
    if ( !$attr['orderby'] )
        unset( $attr['orderby'] );
}

extract(shortcode_atts(array(
    'order'      => 'ASC',
    'orderby'    => 'menu_order ID',
    'id'         => $post ? $post->ID : 0,
    'itemtag'    => 'dl',
    'icontag'    => 'dt',
    'captiontag' => 'dd',
    'columns'    => 3,
    'size'       => 'thumbnail',
    'include'    => '',
    'exclude'    => '',
    'link'       => ''
), $attr, 'gallery'));

$id = intval($id);
if ( 'Rand' == $order )
    $orderby = 'none';

if ( !empty($include) ) {
    $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

    $attachments = array();
    foreach ( $_attachments as $key => $val ) {
        $attachments[$val->ID] = $_attachments[$key];
    }
} elseif ( !empty($exclude) ) {
    $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
} else {
    $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
}

if ( empty($attachments) )
    return '';

if ( is_feed() ) {
    $output = "\n";
    foreach ( $attachments as $att_id => $attachment )
        $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
    return $output;
}

$itemtag = tag_escape($itemtag);
$captiontag = tag_escape($captiontag);
$icontag = tag_escape($icontag);
$valid_tags = wp_kses_allowed_html( 'post' );
if ( ! isset( $valid_tags[ $itemtag ] ) )
    $itemtag = 'dl';
if ( ! isset( $valid_tags[ $captiontag ] ) )
    $captiontag = 'dd';
if ( ! isset( $valid_tags[ $icontag ] ) )
    $icontag = 'dt';

$columns = intval($columns);
$itemwidth = $columns > 0 ? floor(100/$columns) : 100;
$float = is_rtl() ? 'right' : 'left';

$selector = "gallery-{$instance}";

$gallery_style = $gallery_div = '';
if ( apply_filters( 'use_default_gallery_style', true ) )
    $gallery_style = "
    <style type='text/css'>
        #{$selector} {
            margin: auto;
        }
        #{$selector} .gallery-item {
            float: {$float};
            margin-top: 10px;
            text-align: center;
            width: {$itemwidth}%;
        }
        #{$selector} img {
            border: 2px solid #cfcfcf;
        }
        #{$selector} .gallery-caption {
            margin-left: 0;
        }
        /* see gallery_shortcode() in wp-includes/media.php */
    </style>";
$size_class = sanitize_html_class( $size );
$gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
$output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

$i = 0;
foreach ( $attachments as $id => $attachment ) {
    if ( ! empty( $link ) && 'file' === $link )
        $image_output = wp_get_attachment_link( $id, $size, false, false );
    elseif ( ! empty( $link ) && 'none' === $link )
        $image_output = wp_get_attachment_image( $id, $size, false );
    else
        $image_output = wp_get_attachment_link( $id, $size, true, false );

    $image_meta  = wp_get_attachment_metadata( $id );

    $orientation = '';
    if ( isset( $image_meta['height'], $image_meta['width'] ) )
        $orientation = ( $image_meta['height'] > $image_meta['width'] ) ? 'portrait' : 'landscape';

    $output .= "<{$itemtag} class='gallery-item'>";
    $output .= "
        <{$icontag} class='gallery-icon {$orientation}'>
            $image_output
        </{$icontag}>";
    if ( $captiontag && trim($attachment->post_excerpt) ) {
        $output .= "
            <{$captiontag} class='wp-caption-text gallery-caption'>
            " . wptexturize($attachment->post_excerpt) . "
            </{$captiontag}>";
    }
    $output .= "</{$itemtag}>";
    if ( $columns > 0 && ++$i % $columns == 0 )
        $output .= '<br style="clear: both" />';
}

$output .= "
        <br style='clear: both;' />
    </div>\n";

return $output;
}
add_filter("post_gallery", "is_gallery",10,2);

Pouvez-vous me montrer comment insérer la fonction de catégorie dans le galley_shortcode?

Merci d'avance.


Cela serait-il correct alors?

function is_gallery($output, $attr) {
$post = get_post();

static $instance = 0;
$instance++;

if ( ! empty( $attr['ids'] ) ) {
// 'ids' is explicitly ordered, unless you specify otherwise.
if ( empty( $attr['orderby'] ) )
    $attr['orderby'] = 'post__in';
$attr['include'] = $attr['ids'];
}

// Allow plugins/themes to override the default gallery template.
$output = apply_filters('post_gallery', '', $attr);
if ( $output != '' )
return $output;

// We're trusting author input, so let's at least make sure it looks like a valid     orderby statement
if ( isset( $attr['orderby'] ) ) {
$attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
if ( !$attr['orderby'] )
    unset( $attr['orderby'] );
}

extract(shortcode_atts(array(
'order'      => 'ASC',
'orderby'    => 'menu_order ID',
'id'         => $post ? $post->ID : 0,
'itemtag'    => 'dl',
'icontag'    => 'dt',
'captiontag' => 'dd',
'columns'    => 3,
'size'       => 'thumbnail',
'include'    => '',
'exclude'    => '',
'link'       => ''
), $attr, 'gallery'));

$id = intval($id);
if ( 'Rand' == $order )
$orderby = 'none';

$beta_attachments = new WP_Query( array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => 0,
'category_name' => 'beta', // note: use category SLUG
) );

$beta_id_array = array();
foreach ( $beta_attachments as $beta ) {
$beta_id_array[] = $beta->ID;
}
$beta_ids = implode( ',', $beta_id_array );

$gamma_attachments = new WP_Query( array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => 0,
'category_name' => 'gamma', // note: use category SLUG
) );

$gamma_id_array = array();
foreach ( $gamma_attachments as $gamma ) {
$gamma_id_array[] = $gamma->ID;
}
$gamma_ids = implode( ',', $gamma_id_array );

$alpha_attachments = new WP_Query( array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => 0,
'category_name' => 'alpha', // note: use category SLUG
) );

$alpha_id_array = array();
foreach ( $alpha_attachments as $alpha ) {
$alpha_id_array[] = $alpha->ID;
}
$alpha_ids = implode( ',', $alpha_id_array );

if ( !empty($include) ) {
$_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

$attachments = array();
foreach ( $_attachments as $key => $val ) {
    $attachments[$val->ID] = $_attachments[$key];
}
} elseif ( !empty($exclude) ) {
$attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
} else {
$attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
}

if ( empty($attachments) )
return '';

if ( is_feed() ) {
$output = "\n";
foreach ( $attachments as $att_id => $attachment )
    $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
return $output;
}

$itemtag = tag_escape($itemtag);
$captiontag = tag_escape($captiontag);
$icontag = tag_escape($icontag);
$valid_tags = wp_kses_allowed_html( 'post' );
if ( ! isset( $valid_tags[ $itemtag ] ) )
$itemtag = 'dl';
if ( ! isset( $valid_tags[ $captiontag ] ) )
$captiontag = 'dd';
if ( ! isset( $valid_tags[ $icontag ] ) )
$icontag = 'dt';

$columns = intval($columns);
$itemwidth = $columns > 0 ? floor(100/$columns) : 100;
$float = is_rtl() ? 'right' : 'left';

$selector = "gallery-{$instance}";

$gallery_style = $gallery_div = '';
if ( apply_filters( 'use_default_gallery_style', true ) )
$gallery_style = "
<style type='text/css'>
    #{$selector} {
        margin: auto;
    }
    #{$selector} .gallery-item {
        float: {$float};
        margin-top: 10px;
        text-align: center;
        width: {$itemwidth}%;
    }
    #{$selector} img {
        border: 2px solid #cfcfcf;
    }
    #{$selector} .gallery-caption {
        margin-left: 0;
    }
    /* see gallery_shortcode() in wp-includes/media.php */
</style>";
$size_class = sanitize_html_class( $size );
$gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
$output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

$i = 0;
foreach ( $attachments as $id => $attachment ) {
if ( ! empty( $link ) && 'file' === $link )
    $image_output = wp_get_attachment_link( $id, $size, false, false );
elseif ( ! empty( $link ) && 'none' === $link )
    $image_output = wp_get_attachment_image( $id, $size, false );
else
    $image_output = wp_get_attachment_link( $id, $size, true, false );

$image_meta  = wp_get_attachment_metadata( $id );

$orientation = '';
if ( isset( $image_meta['height'], $image_meta['width'] ) )
    $orientation = ( $image_meta['height'] > $image_meta['width'] ) ? 'portrait' : 'landscape';

$output .= "<{$itemtag} class='gallery-item'>";
$output .= "
    <{$icontag} class='gallery-icon {$orientation}'>
        $image_output
    </{$icontag}>";
if ( $captiontag && trim($attachment->post_excerpt) ) {
    $output .= "
        <{$captiontag} class='wp-caption-text gallery-caption'>
        " . wptexturize($attachment->post_excerpt) . "
        </{$captiontag}>";
}
$output .= "</{$itemtag}>";
if ( $columns > 0 && ++$i % $columns == 0 )
    $output .= '<br style="clear: both" />';
}

$output .= "
    <br style='clear: both;' />
</div>\n";

return $output;
}
add_filter("post_gallery", "is_gallery",10,2);

Mettre à jour

salut Chip,

J'ai compris votre idée/solution maintenant et je l'ai essayée (enfin copiée grâce à vous). Je pense que la logique fonctionne, mais son utilisation n’est pas pratique. J'ai utilisé le code comme ça et il ne "voit" pas les catégories. Par conséquent, il affiche simplement un contenu vide (en dessous de la navigation, bien sûr).

people.php:

 <?php
 /**
 * Template Name: People Gallery
 */

 get_header(); ?>

<?php

$people_attachments = new WP_Query( array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => 0,
'category_name' => 'people', // note: use category SLUG
) );

$people_id_array = array();

if ( $people_attachments->have_posts() ) : while ( $people_attachments->have_posts() ) : $people_attachments->the_post();

$people_id_array[] = get_the_ID();

endwhile; endif;
// Important!
wp_reset_postdata();

$people_ids = implode( ',', $people_id_array );

echo do_shortcode( '[gallery link="file" columns="5" order="DESC" orderby="ID" include="' . $people_ids . '"]' );

?>

<?php var_dump( $people_id_array ); ?>

<?php // get_sidebar(); ?>

<?php get_footer(); ?>

Travaille maintenant

1
vega

Modifier

Si tel est votre objectif:

Je souhaite utiliser la galerie Wordpress pour afficher toutes les images d'une catégorie dans une galerie (sur une page fixe), que je n'ai pas à mettre à jour en permanence en insérant les images manuellement.

Ensuite, le moyen le plus simple de le réaliser consiste à utiliser un modèle de page personnalisé .

Créer le modèle

  1. Copiez votre fichier de modèle page.php et nommez-le template-alpha-gallery.php
  2. En haut, ajoutez ce qui suit:

    <?php
    /**
     * Template Name: Alpha Gallery
     */
    
  3. Conservez <?php get_header(); ?> et <?php get_footer(); ?>, ainsi que le balisage HTML à conserver. Supprimez le code de boucle existant.

  4. Remarque: le modèle de balise HTML/loop dépend très fortement du thème. Vous devrez modifier ces instructions en fonction de votre thème actuel.
  5. Au lieu du code de la boucle, ajoutez la sortie du code court ci-dessous:

    $alpha_attachments = new WP_Query( array(
        'post_type' => 'attachment',
        'post_status' => 'inherit',
        'posts_per_page' => 0,
        'category_name' => 'alpha', // note: use category SLUG
    ) );
    
    $alpha_id_array = array();
    
    foreach ( $alpha_attachments as $alpha ) {
        $alpha_id_array[] = $alpha->ID;
    }
    
    $alpha_ids = implode( ',', $alpha_id_array );
    
    echo do_shortcode( '[gallery include="' . $gallery_ids . '"]' );
    
  6. Créez une nouvelle page statique et affectez-lui le modèle de page "Alpha Gallery"

  7. Profitez de votre galerie

Réponse originale

Le shortcode [gallery] n'accepte pas de paramètre "category". Cependant, , il inclut un paramètre 'include' , qui accepte une liste d'ID de pièces jointes séparées par des virgules. :

[gallery include="1,2,3"]

Ainsi, vous pouvez utiliser include pour répertorier les ID de toutes les pièces jointes ayant la catégorie spécifiée.

Commencez par interroger les pièces jointes correctes:

$alpha_attachments = new WP_Query( array(
    'post_type' => 'attachment',
    'post_status' => 'inherit',
    'posts_per_page' => 0,
    'category_name' => 'alpha', // note: use category SLUG
) );

Ensuite, parcourez et récupérez les ID:

Modifier

Vous devez WordPress parcourir les résultats. Au lieu de cela:

$alpha_id_array = array();

foreach ( $alpha_attachments as $alpha ) {
    $alpha_id_array[] = $alpha->ID;
}

... fais ceci:

$alpha_id_array = array();

if ( $alpha_attachments->have_posts() ) : while ( $alpha_attachments->have_posts() ) : $alpha_attachments->the_post();

    $alpha_id_array[] = get_the_ID();

endwhile; endif;
// Important!
wp_reset_postdata();

Ensuite, formatez la chaîne:

$alpha_ids = implode( ',', $alpha_id_array );

Ensuite, passez cette chaîne au shortcode. Si vous utilisez un modèle de page personnalisé, vous pouvez le faire comme suit:

echo do_shortcode( '[gallery include="' . $alpha_ids . '"]' );

Et ça devrait être ça.

Modifier

Lorsque je clique sur le fichier, il charge la plus grande taille disponible. Pouvez-vous me dire où se trouve la création du lien ou l'expression pour quelle taille ouvrir. J'ai créé des tailles personnalisées, par exemple "gallerysize" ou "blogsize", mais je ne sais pas comment les utiliser ici, dans cette galerie.

Le shortcode [gallery] A UN PARAMÈTRE size . Ajoutez-le simplement à votre sortie; par exemple, pour les images "moyennes":

echo do_shortcode( '[gallery size="medium" include="' . $alpha_ids . '"]' );
2
Chip Bennett