web-dev-qa-db-fra.com

Édition de shortcode intégré dans la galerie pour filtrer par catégories

J'essaie donc d'ajouter ou de modifier le shortcode intégré à la galerie afin qu'il puisse afficher toutes les images d'une catégorie spécifique que nous appellerons médecine interne avec un identifiant de 2, mais pouvant également avoir les mêmes fonctionnalités si je le souhaite. récupérer toutes les images d'une catégorie différente, appelons le centre-ville avec un identifiant de 4, par où puis-je commencer? Voici le code du shortcode intégré que j'essaie de modifier.

    add_shortcode('gallery', 'gallery_shortcode');
/**
 * Builds the Gallery shortcode output.
 *
 * This implements the functionality of the Gallery Shortcode for displaying
 * WordPress images on a post.
 *
 * @since 2.5.0
 *
 * @staticvar int $instance
 *
 * @param array $attr {
 *     Attributes of the gallery shortcode.
 *
 *     @type string       $order      Order of the images in the gallery. Default 'ASC'. Accepts 'ASC', 'DESC'.
 *     @type string       $orderby    The field to use when ordering the images. Default 'menu_order ID'.
 *                                    Accepts any valid SQL ORDERBY statement.
 *     @type int          $id         Post ID.
 *     @type string       $itemtag    HTML tag to use for each image in the gallery.
 *                                    Default 'dl', or 'figure' when the theme registers HTML5 gallery support.
 *     @type string       $icontag    HTML tag to use for each image's icon.
 *                                    Default 'dt', or 'div' when the theme registers HTML5 gallery support.
 *     @type string       $captiontag HTML tag to use for each image's caption.
 *                                    Default 'dd', or 'figcaption' when the theme registers HTML5 gallery support.
 *     @type int          $columns    Number of columns of images to display. Default 3.
 *     @type string|array $size       Size of the images to display. Accepts any valid image size, or an array of width
 *                                    and height values in pixels (in that order). Default 'thumbnail'.
 *     @type string       $ids        A comma-separated list of IDs of attachments to display. Default empty.
 *     @type string       $include    A comma-separated list of IDs of attachments to include. Default empty.
 *     @type string       $exclude    A comma-separated list of IDs of attachments to exclude. Default empty.
 *     @type string       $link       What to link each image to. Default empty (links to the attachment page).
 *                                    Accepts 'file', 'none'.
 * }
 * @return string HTML content to display gallery.
 */
function gallery_shortcode( $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'];
    }
    /**
     * Filters the default gallery shortcode output.
     *
     * If the filtered output isn't empty, it will be used instead of generating
     * the default gallery template.
     *
     * @since 2.5.0
     * @since 4.2.0 The `$instance` parameter was added.
     *
     * @see gallery_shortcode()
     *
     * @param string $output   The gallery output. Default empty.
     * @param array  $attr     Attributes of the gallery shortcode.
     * @param int    $instance Unique numeric ID of this gallery shortcode instance.
     */
    $output = apply_filters( 'post_gallery', '', $attr, $instance );
    if ( $output != '' ) {
        return $output;
    }
    $html5 = current_theme_supports( 'html5', 'gallery' );
    $atts = shortcode_atts( array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post ? $post->ID : 0,
        'itemtag'    => $html5 ? 'figure'     : 'dl',
        'icontag'    => $html5 ? 'div'        : 'dt',
        'captiontag' => $html5 ? 'figcaption' : 'dd',
        'columns'    => 3,
        'size'       => 'thumbnail',
        'include'    => '',
        'exclude'    => '',
        'link'       => ''
    ), $attr, 'gallery' );
    $id = intval( $atts['id'] );
    if ( ! empty( $atts['include'] ) ) {
        $_attachments = get_posts( array( 'include' => $atts['include'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );
        $attachments = array();
        foreach ( $_attachments as $key => $val ) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    } elseif ( ! empty( $atts['exclude'] ) ) {
        $attachments = get_children( array( 'post_parent' => $id, 'exclude' => $atts['exclude'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );
    } else {
        $attachments = get_children( array( 'post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );
    }
    if ( empty( $attachments ) ) {
        return '';
    }
    if ( is_feed() ) {
        $output = "\n";
        foreach ( $attachments as $att_id => $attachment ) {
            $output .= wp_get_attachment_link( $att_id, $atts['size'], true ) . "\n";
        }
        return $output;
    }
    $itemtag = tag_escape( $atts['itemtag'] );
    $captiontag = tag_escape( $atts['captiontag'] );
    $icontag = tag_escape( $atts['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( $atts['columns'] );
    $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    $float = is_rtl() ? 'right' : 'left';
    $selector = "gallery-{$instance}";
    $gallery_style = '';

Donc, le but de ceci serait de pouvoir mettre [gallery category = "2"] ou [gallery id = "2"] ou de quelque manière que ce soit pour qu'il affiche toutes les images d'une catégorie spécifique, ainsi toute aide serait très appréciée!

si je veux que cela fonctionne, je vais pouvoir mettre [gallery category = "emergency-medicine"] et avoir toutes les images ou le top 20 plus récent apparaître dans le message ou un autre exemple serait [gallery post_type = "gallery "category =" medicine "] et ce que j'utilise pour créer ces types/catégories de publications personnalisées est avec le plugin Types de ToolSet

function gallery_shortcode( $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'];
}
/**
 * Filters the default gallery shortcode output.
 *
 * If the filtered output isn't empty, it will be used instead of generating
 * the default gallery template.
 *
 * @since 2.5.0
 * @since 4.2.0 The `$instance` parameter was added.
 *
 * @see gallery_shortcode()
 *
 * @param string $output   The gallery output. Default empty.
 * @param array  $attr     Attributes of the gallery shortcode.
 * @param int    $instance Unique numeric ID of this gallery shortcode instance.
 */
$output = apply_filters( 'post_gallery', '', $attr, $instance );
if ( $output != '' ) {
    return $output;
}
$html5 = current_theme_supports( 'html5', 'gallery' );
$atts = shortcode_atts( array(
    'order'      => 'ASC',
    'orderby'    => 'menu_order ID',
    'id'         => null,
    'itemtag'    => $html5 ? 'figure'     : 'dl',
    'icontag'    => $html5 ? 'div'        : 'dt',
    'captiontag' => $html5 ? 'figcaption' : 'dd',
    'columns'    => 3,
    'size'       => 'thumbnail',
    'include'    => '',
    'exclude'    => '',
    'link'       => '',
    'category' => null,
    'post_type' => 'uc-general-gallery',
    'img' => null
), $attr, 'gallery' );
$ids = array();
ob_start();
if ($atts['id'] != null ) {
    $id_str = preg_replace('/\s+/', '', $atts['id']); // strip whitespace
    $ids = explode(',', $id_str);
    ?>
     <?php foreach($ids as $id): ?>
                <?php if(is_numeric($id)): ?>
                                    <?php endif; ?>
            <?php endforeach; ?>
            <?php
} else if($atts['category'] != null) {
    $cat_str = preg_replace('/\s+/', '', $atts['category']); // strip whitespace
    $args = array(
        'post_type'         => $atts['post_type'],
        'order'             => 'DESC',
        'category_name'     => $cat_str,
        'posts_per_page' => 999
        );
    $the_query = new WP_Query( $args );
    if($the_query->have_posts() ) :
        ?>
         <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
         <?php endwhile; ?>
                     <?php
    endif;
}
if ( ! empty( $atts['include'] ) ) {
    $_attachments = get_posts( array( 'include' => $atts['include'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );
    $attachments = array();
    foreach ( $_attachments as $key => $val ) {
        $attachments[$val->ID] = $_attachments[$key];
    }
} elseif ( ! empty( $atts['exclude'] ) ) {
    $attachments = get_children( array( 'post_parent' => $id, 'exclude' => $atts['exclude'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );
} else {
    $attachments = get_children( array( 'post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );
}
if ( empty( $attachments ) ) {
    return '';
}
if ( is_feed() ) {
    $output = "\n";
    foreach ( $attachments as $att_id => $attachment ) {
        $output .= wp_get_attachment_link( $att_id, $atts['size'], true ) . "\n";
    }
    return $output;
}
$itemtag = tag_escape( $atts['itemtag'] );
$captiontag = tag_escape( $atts['captiontag'] );
$icontag = tag_escape( $atts['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( $atts['columns'] );
$itemwidth = $columns > 0 ? floor(100/$columns) : 100;
$float = is_rtl() ? 'right' : 'left';
$selector = "gallery-{$instance}";
$gallery_style = '';

C’est ce que j’ai fait pour que cela fonctionne (bien que ce soit plutôt moche), alors je peux maintenant saisir [galerie post_type = "uc-general-galerie" category = "personnes-résidents"] ou seulement [galerie catégorie = "etc"] et il va prendre les images et les afficher, mais dans l'éditeur visuel, il ne dit aucun élément trouvé, mais quand je vis réellement le message, il apparaît dans la page, maintenant un autre problème est que j'en ai besoin pour être réactif pour mobile Les utilisateurs peuvent donc se transformer en un curseur ou en un diaporama lorsque l'écran est réduit.

Modifier

Ça ne fait rien! mon code est bogué et affiche chaque image ajoutée au lieu d'aller par catégorie, y aurait-il un moyen facile de résoudre ce problème?

3
plenk117

Il existe différentes manières d'exécuter un autre WP_Query avec une requête de taxe et de collecter les ID dans l'attribut include du shortcode de la galerie.

Essayons une autre approche, sans exécuter un WP_Query secondaire.

Galerie native: prise en charge de la taxonomie et des attributs de terme

Nous introduisons les attributs de shortcode de galerie personnalisés suivants:

[gallery taxonomy="media_category" term="people"]

Voici un plugin de démonstration qui prend en charge cela via les filtres post_gallery, shortcode_atts_gallery et l'action pre_get_posts:

<?php
/**
 * Plugin Name: Native Gallery Shortcode With Taxonomy And Term Filter Support
 * Description: Add support for [gallery taxonomy='some-taxonomy' term="some-term"]
 * Plugin URI:  http://wordpress.stackexchange.com/a/257801/26350
 */

namespace WPSE\Q257743;

class Gallery
{
    private $term;
    private $taxonomy;

    public function init()
    {
        add_filter( 'post_gallery', [$this, 'post_gallery'], 10, 2 );               
    }

    public function post_gallery( $html, $attr )
    {
        // Check user input for term and taxonomy
        if( empty( $attr['term'] ) || empty( $attr['taxonomy'] ) )
            return $html;

        // Validate taxonomy
        if( ! taxonomy_exists( $attr['taxonomy'] ) )
            return esc_html__( "Taxonomy doesn't exists!", 'wpse-257743' );

        // Validate term
        if( ! term_exists( $attr['term'] , $attr['taxonomy'] ) )
            return esc_html__( "Term doesn't exists!", 'wpse-257743' );

        $this->term     = $attr['term'];
        $this->taxonomy = $attr['taxonomy'];

        // Activate customization
        add_filter( 'shortcode_atts_gallery',   [$this, 'gallery_atts'] );
        add_action( 'pre_get_posts',            [$this, 'pre_get_posts'] );

        return $html;
    }

    public function gallery_atts( $pairs )
    {
        // Set include to a temporary non empty value (that becomes 0)
        $pairs['include'] = ' ';

        // Only run once per gallery
        remove_filter( current_filter(), __FUNCTION__ );

        return $pairs;
    }

    public function pre_get_posts( \WP_Query $q )
    {
        // Make sure it's attachments query
        if( 'attachment' !== $q->get( 'post_type' ) )
            return;

        $post__in = $q->get( 'post__in' );

        // Target queries with post__in (include)       
        if ( empty( $post__in ) )
            return;

        // Check for our temporary 0 value
        if( 1 === count( $post__in ) && 0 != $post__in[0] )
            return;

        $q->set( 'post__in', null );

        // Set the taxonomy query:
        $q->set( 'tax_query', 
            [
                [
                    'taxonomy'  => $this->taxonomy,
                    'field'     => 'slug',
                    'terms'     => $this->term,
                ]
            ]
        );

        // Adjust the number of images to e.g. max 100
        $q->set( 'posts_per_page', 100 );

        // Only run once per gallery
        remove_action( current_action(), __FUNCTION__ );
    }

}

add_action( 'init', [new Gallery, 'init' ] );

Notez que nous avons ajouté une limite de 100 images.

J'espère que vous pourrez le tester et l'adapter à vos besoins, par exemple. changez-le pour qu'il puisse supporter plusieurs termes.

1
birgire