J'ai besoin d'afficher des images et d'autres contenus dans la barre latérale en fonction d'une page. Les pages sont ajoutées dynamiquement et les informations devant apparaître dans la barre latérale sont différentes pour chaque page. Donc, je ne peux pas prédire ce qui ira où. L'idée était donc d'avoir le contenu d'une page comme d'habitude (avec tous les codes courts nécessaires) puis, à la fin du contenu de la page, un code court avec toutes les informations devant apparaître dans la barre latérale de cette page.
Je me demandais s'il était possible d'afficher les codes abrégés "de manière sélective".
Par exemple, un shortcode spécifique, appelons-le [sc]
, est spécifié dans le contenu de la page. Maintenant, lors de l'affichage du contenu de cette page, je voudrais supprimer ce shortcode [sc]
, mais l'afficher à partir de la barre latérale de cette page. Le contenu d'une page aura d'autres codes courts. Je souhaite uniquement afficher de manière sélective le shortcode [sc]
et en traiter les autres comme d’habitude - c’est-à-dire que d’autres shortcodes seront traités dans le contenu de la page.
Est-ce possible de faire? Et comment?
Un gestionnaire de shortcode n'a rien à renvoyer, il peut simplement modifier une variable globale que vous avez lue ultérieurement dans votre widget de la barre latérale. Si votre barre latérale est affichée après le contenu de votre message (le plus souvent s'il s'agit d'une barre latérale droite), vous pouvez le faire sans problème. Si votre barre latérale est affichée avant le contenu de l'article, c'est plus compliqué: vous devez démarrer la mise en mémoire tampon de sortie lors de l'appel de votre widget, attendez que le reste de la page s'affiche, puis faites quelque chose avec le contenu du code court et videz le tampon de sortie.
Une simple "preuve de concept" qui affiche le contenu du shortcode pas dans l'article, mais dans le pied de page:
$wpse13925_shortcode_content = array();
add_shortcode( '13925', 'wpse13925_shortcode' );
function wpse13925_shortcode( $shortcode_attr, $shortcode_content )
{
$GLOBALS['wpse13925_shortcode_content'][] = $shortcode_content;
return '';
}
add_action( 'wp_footer', 'wpse13925_footer' );
function wpse13925_footer()
{
var_dump( $GLOBALS['wpse13925_shortcode_content'] );
}
J'ai basé ma solution sur Jan Fabry's
answer. Je n'ai pas de widgets, mais de simples fichiers modèles.
Donc, ce que j'ai fait est le suivant:
Spécifié toutes les informations devant apparaître dans la barre latérale dans le contenu d'une page lui-même encapsulé dans [sidebar_content]
shortcode.
Spécifie la fonction suivante dans le fichier functions.php. Cela développe tout le contenu de [sidebar_content]
, mais n'affiche rien, mais l'enregistre dans la variable globale.
global $sidebar_content;
add_shortcode("sidebar_content", "my_sidebar_content");
function my_sidebar_content($atts, $content = null){
global $sidebar_content;
if( !empty($content) ){
$sidebar_content = do_shortcode($content);
}
return "";
}
Dans le sidebar.php
. J'ai le code suivant:
global $sidebar_content;
if( isset($sidebar_content) && !empty($sidebar_content) ){
echo $sidebar_content;
}
Vous pouvez utiliser des balises conditionnelles et do_shortcode. http://codex.wordpress.org/Function_Reference/do_shortcode
http://codex.wordpress.org/Conditional_Tags
Un exemple simple pour une seule page avec un ID de 12.
if is_single(12){
do_shortcode('[shortcode]');
}
Si, au lieu de cela, vous avez écrit ce code court vous-même, vous pouvez créer une fonction pour lui attribuer un paramètre d'affichage, tel que [shortcode('page=5, 6, 7', 'category', 'exclude=posts', 'whatever')]
.
Vous pouvez le faire en fonction d'un champ personnalisé, par exemple créer un champ personnalisé nommé sc_no_show
et lui attribuer la valeur true. alors dans votre fonction de shortcode, faites quelque chose comme ça:
function what_ever(){
global $post;
$no_show = get_post_meta($post->ID,'sc_no_show',true);
if ($no_show)
return '';
//add your normal shortcode stuff here
}
Maintenant, sur chaque page ou poste, vous avez un champ personnalisé nommé sc_no_show
avec la valeur true
, il ne sera pas affiché /
Vous pouvez utiliser quelques actions bien placées pour regarder votre code abrégé, s'il est détecté, définissez un indicateur et exécutez des actions supplémentaires pour supprimer le contenu de ce code abrégé, puis une action secondaire pour exécuter ce code abrégé dans la barre latérale. À côté de tout cela, créez une action simple de votre choix à l'intérieur du fichier de la barre latérale et accrochez-vous dessus lorsque vous devez imprimer le shortcode.
Ne pas suivre? Ne vous en voulez pas, je ne suis pas toujours doué pour expliquer des idées, alors voici un exemple sous forme de code.
Tout d'abord, dans la barre latérale où vous souhaitez afficher le contenu du shortcode, ajoutez quelque chose du genre ..
<?php do_action( 'special_shortcode_content' ); ?>
Nous avons maintenant une action à laquelle nous pouvons nous raccrocher lorsqu'un drapeau est installé.
Ensuite, nous devons analyser les articles, avant que la boucle ne se produise, vérifier l’existence d’un shortcode particulier, je vais utiliser [sc]
selon votre exemple et nous pouvons le faire en nous raccordant à the_posts
. Plutôt que d'utiliser une variable globale, je préfère simplement envelopper le code dans une classe et définir une variable de classe à l'intérieur de la classe pour qu'elle serve d'indicateur.
class Page_Shortcode_to_Sidebar {
private $has_shortcode = false;
public function __construct() {
if( is_admin() )
return;
add_action( 'the_posts', array( $this, 'check_for_shortcode' ) );
add_filter( 'the_content', array( $this, 'remove_shortcode' ), 1 );
}
public function check_for_shortcode( $posts ) {
if( empty( $posts ) )
return $posts;
if( !is_page() )
return $posts;
foreach( $posts as $post ) {
if( !stripos( $post->post_content, '[sc]' ) )
continue;
$this->has_shortcode = true;
}
return $posts;
}
public function remove_shortcode( $content ) {
if( !$this->has_shortcode )
return $content;
$content = str_replace( '[sc]', '', $content );
add_action( 'special_shortcode_content', array( $this, 'do_shortcode' ) );
return $content;
}
public function do_shortcode() {
?>
<li><?php do_shortcode('[sc]'); ?></li>
<?php
}
}
$Page_Shortcode_to_Sidebar = new Page_Shortcode_to_Sidebar;
Donc, fondamentalement, ce qui se passe est-ce ..
the_posts
vérifie le code abrégé de chaque publication, le cas échéant, active le drapeau.the_content
s'exécute plus tard et vérifie si l'indicateur est défini.Si vous faites référence à votre propre shortcode que vous avez créé, et que vous l'utilisez de cette façon.
[sc]something[/sc]
..alors vous aurez besoin de quelque chose de plus intelligent pour supprimer le contenu du code court du contenu de la publication.
Si ce n'est pas utilisé comme ça, alors ce que j'ai fourni ci-dessus devrait faire l'affaire correctement.
J'espère que cela pourra aider.. :)