Je voudrais remplacer tous les {POST_NAME}
de mes widgets de texte sur la barre latérale single.php
. Je pense à quelque chose comme ça
global $post;
$POST_NAME= $post->post_name;
$sidebar = preg_replace('/\{(POST_NAME)\}/e', "$$1", $sidebar);
Comment obtenir le code HTML de la barre latérale dans \$sidebar
Votre code semble bien et les considérations sont correctes. Pour atteindre votre objectif, je collecterais le HTML et le résumerais comme suit:
Au lieu d'appeler <?php dynamic_sidebar($sidebar_id); ?>
, utilisez <?php dynamic_sidebar_replaced($sidebar_id); ?>
avec une fonction (ajoutez-la à functions.php) ci-dessous:
function dynamic_sidebar_replaced($sidebar_id) {
if (is_single()) { // Optionally, to ensure you're at the single post template.
ob_start(); // Start gathering output
dynamic_sidebar($sidebar_id);
global $post;
$POST_NAME = $post->post_name;
$sidebar = preg_replace('/\{(POST_NAME)\}/e', "$$1", $sidebar);
ob_end_clean();
echo $sidebar;
return '';
}
dynamic_sidebar($sidebar_id);
}
Je ne pense pas qu'il existe un moyen particulièrement efficace de le faire universellement. Vous pouvez utiliser le filtre widget_display_callback
pour modifier une instance de widget avant sa sortie, mais cette opération peut être remplacée par des widgets. Vous pouvez parcourir tous les widgets et remplacer leurs rappels par un wrapper de votre choix. Mais modifier l'instance ne garantira pas que vous aurez accès à la sortie comme prévu.
La seule façon dont je puisse penser le garantir est de mettre en tampon et de capturer la sortie de dynamic_sidebar
, de remplacer votre chaîne et d’imprimer la chaîne modifiée.
ob_start();
dynamic_sidebar( 'sidebar' );
$sidebar_string = ob_get_contents();
ob_end_clean();
echo str_replace( '{POST_NAME}', $post->post_name, $sidebar_string );