web-dev-qa-db-fra.com

obtenir les attributs/une partie du shortcode de la galerie

J'essaie de récupérer tous les identifiants d'image associés au shortcode [gallery] répertoriés comme exclus. Par exemple: si ma publication a [gallery exclude="1,2,3"], j'aimerais obtenir une variable qui ressemblerait à ceci echo $excludes; résultat 1,2,3 merci pour toute aide que vous pourriez offrir.

2
sosukeinu

Cela m'a pris un certain temps pour trouver une solution qui fonctionnait pour moi, mais comme je ne cherchais que la liste délimitée des identifiants de pièce jointe associés à un attribut tel que exclude ou hide, cela a fonctionné pour moi:

# Grab the list of "hide" attribute
$regex_pattern = get_shortcode_regex();
preg_match ('/'.$regex_pattern.'/s', $post->post_content, $regex_matches);
    if ($regex_matches[2] == 'gallery') :
     $attribureStr = str_replace (" ", "&", trim ($regex_matches[3]));
     $attribureStr = str_replace ('"', '', $attribureStr);
     //  Parse the attributes
      $defaults = array (
      'hide' => '1',
     );
    $attributes = wp_parse_args ($attribureStr, $defaults);
     if (isset ($attributes["hide"])) :
      $excludeID = get_post_thumbnail_id() . ',' . $attributes["hide"];
     else :
      $excludeID = get_post_thumbnail_id();
   endif;
endif;
1
sosukeinu

La tâche

Ce n'est pas aussi facile que ça en a l'air au premier coup d'œil. Le problème principal est que vous pouvez définir votre propre shortcode [gallery] et simplement remplacer le code par défaut. En fait, c’est ce que font certains thèmes (blâmez-vous les auteurs de ThemeForest!). Dans ce cas, il ne suffit pas de s’attacher à post_gallery dans tous les cas.

Inconvénients pour post_gallery

Le problème est que le code abrégé, ainsi que le rappel principal, peuvent être remplacés et que, par conséquent, chaque rappel sera tout simplement désactivé.

Inconvénients pour the_content

Si vous passez à un autre filtre et prenez la sortie brute, vous devrez alors traiter (une autre fois) avec la regex. C'est lent et la plupart du temps ne sera pas simple.

Alors que faire maintenant? Facile. Interagissez avec le global $shortcode_tags. Le rappel est utilisé comme second argument, il n'est donc pas trop difficile de déterminer dans quel cas nous sommes. Ensuite, nous pouvons simplement passer à la demande. De cette façon, nous avons un juste équilibre entre fiabilité et performance.

Construire un plugin de base

Voici un plugin qui définit une classe abstract (une classe qui doit recevoir extended pour fonctionner). Il y a trois choses qui nécessitent une définition dans la classe enfant:

  • $part - la partie que vous voulez récupérer
  • $type - le type de correspondance dont vous avez besoin. Valide sont digit/alphanumeric/alpha
  • process_atts() - la méthode qui traite votre sortie - peu importe ce que vous voulez faire avec le résultat

Il suffit de télécharger ceci via (S) FTP dans votre dossier de plugins et de l'activer.

<?php
/** Plugin Name: (#70451) »kaiser« Get Gallery attributes (Base) */
if ( ! class_exists( 'wpse70451_extract_gallery_atts' ) )
{

abstract class wpse70451_extract_gallery_atts
{
    public $atts  = array();

    public $error;

    // Must get defined in extending class
    public $part;
    public $type;

    public static function init()
    {
        is_null( self :: $instance ) AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        ! isset( $this->part ) AND new WP_Error();

        add_action( 'loop_start', array( $this, 'error_handler' ) );

        // The value of the array is the callback fn name
        // If it's the default, then we're on the safe side,
        // as the core fn is no pluggable and can't get overridden.
        if ( 'gallery_shortcode' === $GLOBALS['shortcode_tags'] )
        {
            add_filter( 'post_gallery', array( $this, 'get_gallery_atts' ), 0, 2 );
        }
        // Else we have to go with a slower regex
        else
        {
            add_filter( 'the_content', array( $this, 'get_gallery_ids' ), 0 );
        }
    }

    public function error_handler()
    {
        if (
            ! in_array(
                 $this->type
                ,array(
                     'digit'
                    ,'alphanumeric'
                    ,'alpha'
                 )
            )
            OR ! empty( $this->type )
        )
            return new WP_Error( 
                 'invalid_type'
                ,__( 'Invalid type set.', 'wpse70451_textdomain' )
                ,__FILE__
            );
    }

    public function __toString()
    {
        $is_error = $this->error;

        if ( ! is_wp_error( $is_error ) )
            return;

        // No error message for Guests or Subscribers
        // Assuming that no one has activated caching plugins when debugging
        // and not set WP_DEBUG to TRUE on a live site
        if ( 
            ! is_user_logged_in()
            AND ! current_user_can( 'edit_posts' ) 
            AND ( ! defined( 'WP_DEBUG' ) OR ! WP_DEBUG )
        )
            return '';

        // Error output for development
        return "{$is_error->get_error_message( 'invalid_type' )}: {$is_error->get_error_data()}";
    }

    public function get_gallery_ids( $content )
    {
        $pattern = get_shortcode_regex( $content );
        preg_match_all( "/{$pattern}/s", $content, $matches );
        $atts = explode( " ", array_shift( $matches[3] ) );
        foreach ( $atts as $att )
        {
            if ( strstr( $att, $this->part ) )
                break;
        }
        preg_match_all( $this->get_regex( $this->type ), trim( $att ), $atts );
        $this->atts = array_filter( $atts );

        return $content;
    }

    // Build pattern
    public function get_regex( $type )
    {
        switch ( $type )
        {
            case 'digit' :
                $pattern_atts = '/(\d*)/';
                break;

            case 'alphanumeric' :
                $pattern_atts = '/([A-Za-z0-9]*)/';
                break;

            case 'alpha' :
                $pattern_atts = '/([A-Za-z]*)/';
                break;

            default :
                // Add a method name `get_pattern()` to the extending class
                // to work with a custom regex pattern.
                if (  method_exists( $this, 'get_pattern' ) )
                {
                    $pattern_atts = $this->get_pattern();
                    break;
                }
                $pattern_atts = $this->get_regex( 'alphanumeric' );
                break;
        }

        return $pattern_atts;
    }

    public function get_gallery_atts( $content, $atts )
    {
        $this->atts = $atts[ $this->part ];

        // Allow overrides to trigger
        // at this point we already got what we need
        return $content;
    }

    // Must get defined in extending class
    public abstract function process_atts() {}
} // END Class

} // endif;

Gérer une tâche, avoir un enfant

Ici vous voyez le plugin de traitement actuel. Tout d'abord, il se raccorde statiquement au hook init, puis exécute la méthode parents __construct() pour récupérer les attributs.

Ensuite, vous devez définir quels attributs vous souhaitez récupérer (voir les propriétés de classes $part et $type, qui correspondent déjà par défaut à ce que vous avez demandé).

Les deux dernières décisions que vous devez prendre sont

  1. Qu'est-ce que je veux faire avec mon résultat? Voir process_atts()
  2. Quand voulez-vous sortir le résultat? Voir __construct() et où process_atts() est connecté.

C'est aussi simple que ça.

Si vous avez besoin d'une expression rationnelle personnalisée, ajoutez simplement une méthode nommée get_regex() à votre classe d'extension et return à votre modèle personnalisé. Puis définissez $type sur et une chaîne vide '' et vous êtes prêt.

<?php
/** Plugin Name: (#70451) »kaiser« Get Gallery excludes */

if ( ! class_exists( 'wpse70451_extract_gallery_excludes' ) )
{
    add_action( 'init', array( 'wpse70451_extract_gallery_excludes', 'init' ) );

final class wpse70451_extract_gallery_excludes extends wpse70451_extract_gallery_atts
{
    public static $instance;

    public $part = 'exclude';

    public $type = 'digit';

    public static function init()
    {
        is_null( self :: $instance ) AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        parent :: __construct();

        // Example hook: `loop_end`
        add_action( 'loop_end', array( $this, 'process_atts' ) );
    }

    public function process_atts()
    {
        $markup = '';
        // Do something with $this->atts;
        return print $markup;
    }
} // END Class

} // endif;

Modifiez ce dont vous avez besoin, puis à nouveau: il vous suffit de télécharger ceci via (S) FTP dans votre dossier de plugins et de l'activer.

3
kaiser

Si vous devez également afficher le contenu sur la même page, qu'en est-il du filtre post_gallery? Vous n'aurez pas besoin de regex alors

add_filter('post_gallery', 'gallery_shortcode_excludes', 10, 2);
function gallery_shortcode_excludes($content, $attr) {
    $excludes = $attr['excludes'];
    // maybe also save it in some global/class/static variable

    //  return empty string to let wordpress continue to the shortcode output
    return '';
}
1
Mridul Aggarwal