Je travaille sur un shortcode personnalisé:
[abuzz-store slug="woolworths" fields="description,level,phone" more="true"]
Le shortcode fonctionne correctement sur l'interface du site. Cependant, je ne peux plus sauvegarder les modifications apportées aux pages dans wp-admin. Plusieurs erreurs PHP sont générées par une tentative d'exécution du shortcode en dehors du modèle approprié.
Voici la fonctionnalité de shortcode:
/**
* [indo_store_details_shortcode description]
*
* @param [type] $atts [description]
* @return [type] [description]
*/
function indo_store_details_shortcode($atts)
{
$options = shortcode_atts(array(
// Abuzz Store slug
'slug' => '',
// Abuzz Store fields to display (title, description, level, phone)
'fields' => '',
// Display a link to further store details (store page)
'more' => false,
), $atts);
// sanity checks
if (!$options['slug']) return '';
// if (is_admin()) return '';
$output = '';
// retrieve store information
$store = get_posts(array(
'name' => $options['slug'],
'post_type' => 'store',
))[0];
// determine fields to display
$fields = explode(',', $options['fields']);
$output .= '<article class="abuzz-store">';
// title field
if (in_array('title', $fields)) {
$output .= sprintf('<h2>%s</h2>', $post->post_title);
}
// "metadata" .options-list
if (in_array('level', $fields) ||
in_array('phone', $fields)) {
$output .= '<ul class="nav options-list">';
// level field
if (in_array('level', $fields)) {
$levels = get_group('Level', $store->ID);
$output .= sprintf('<li class="icon-text"><i class="icon-text__icon icon icon-level-black"></i> %s</li>', indo_combine_levels($levels));
}
// phone field
if (in_array('phone', $fields)) {
$output .= sprintf('<li class="icon-text"><i class="icon-text__icon icon icon-phone-black"></i> %s</li>', get('phone_number', 1, 1, $store->ID));
}
$output .= '</ul>';
}
// description field
if (in_array('description', $fields)) {
$output .= get('information_text', 1, 1, $store->ID);
}
// "More details" link
if ($options['more']) {
$output .= sprintf('<p><a href="%s" title="More details" class="btn btn--black-arrow icon-text--rev">More details <i class="icon-text__icon icon icon-arrow-white"></i></a></p>', get_permalink($store->ID));
}
$output .= "</article>\n";
return $output;
}
add_shortcode('abuzz-store', 'indo_store_details_shortcode');
Erreur: Erreur fatale: appel de la fonction non définie get_group () dans D:\xampp\htdocs\126-indooroopilly-shopping-center\www\public_html\wp-content\themes\indooroopilly\include\shortcodes.php à la ligne 90
get_group
est une fonction ajoutée par un plugin tiers (Magic Fields), qui n'est pas chargée dans wp-admin. C'est ce à quoi je m'attendrais.
Pourquoi cela est-il exécuté lorsque la page est enregistrée?
Les codes courts doivent return , not echo ou print leur sortie. Comme l'explique l'entrée du Codex pour add_shortcode()
:
Notez que la fonction appelée par le shortcode ne doit jamais produire de sortie d'aucune sorte. Les fonctions de shortcode devraient renvoyer le texte à utiliser pour remplacer le shortcode. La production directe de la sortie conduira à des résultats inattendus. Ceci est similaire à la façon dont les fonctions de filtrage doivent se comporter, en ce sens qu'elles ne doivent pas produire les effets secondaires attendus de l'appel, car vous ne pouvez pas contrôler quand et où elles sont appelées.
Changez votre fonction de rappel de shortcode en return sa valeur.
Vous pouvez également envisager d’utiliser la mise en mémoire tampon de la sortie PHP pour votre shortcode ob_start et ob_get_clean comme ceci:
function indo_store_details_shortcode( $attr ) {
ob_start();
//Add all your shortcode stuff here
return ob_get_clean();
}
add_shortcode( 'abuzz-store', 'indo_store_details_shortcode' );
La fonction ob_start active la mise en mémoire tampon de la sortie. Tant que la mise en mémoire tampon de sortie est active, aucune sortie n'est envoyée à partir du script (autres que les en-têtes). À la place, la sortie est stockée dans une mémoire tampon interne.