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.
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;
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.
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é.
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.
Voici un plugin qui définit une classe abstract
(une classe qui doit recevoir extend
ed 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ésultatIl 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;
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
process_atts()
__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.
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 '';
}