web-dev-qa-db-fra.com

Shortcode personnalisé en cours d'exécution lors de l'enregistrement d'une page dans wp-admin

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?

5
Matt Stone

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.

6
Chip Bennett

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.

3
Jamie Edwards