web-dev-qa-db-fra.com

Utilisation de crochets d'action à l'intérieur d'un shortcode

J'essaie de créer un plug-in modulaire qui inclut des points d'ancrage permettant aux développeurs d'ajouter du contenu avant et après le contenu du shortcode principal. J'ai des problèmes parce que tout ce que je fais dans la fonction appelée par le hook d'action est toujours répercuté en haut du shortcode au lieu d'être à l'intérieur du shortcode auquel il appartient.

J'ai cherché et je suis tombé sur cette réponse de Pippin Williams sur un fil de discussion récent de ThemeForest, où il recommande d'utiliser la mise en mémoire tampon de sortie. Je n'ai pas réussi à ce que cela fonctionne correctement pour moi, et j'ai lu ailleurs que la mise en mémoire tampon de sortie ne devrait être utilisée qu'en dernier recours, je recherche donc toujours une solution propre.

Le shortcode le plus simple jamais créé:

add_shortcode('shortcode','example_shortcode');

function example_shortcode( $atts ) {

  $shortcode_output = "<p>Some shortcode content.</p>";
  $shortcode_output .= "<p>More shortcode content.</p>";

  return $shortcode_output;

}

Ajoutons maintenant une action:

add_shortcode('shortcode','example_shortcode');

function example_shortcode( $atts ) {

  $shortcode_output = "<p>Some shortcode content.</p>";
  $shortcode_output .= "<p>More shortcode content.</p>";

  do_action('below_shortcode');

  return $shortcode_output;
}

add_action('below_shortcode', 'example_action_output');

function example_action_output() {
    echo "<p>This should be output at the end.</p>";
}

Le contenu de example_action_output () est renvoyé au-dessus du contenu du shortcode en raison de l'instruction echo. J'ai essayé de mettre en tampon de sortie comme recommandé par Pippin:

add_shortcode('shortcode','example_shortcode');

function example_shortcode( $atts ) {

  $shortcode_output = "<p>Some shortcode content.</p>";
  $shortcode_output .= "<p>More shortcode content.</p>";

  ob_start();
  do_action('below_shortcode');
  return ob_get_clean();

  return $shortcode_output;
}

add_action('below_shortcode', 'example_action_output');

function example_action_output() {
    echo "<p>This should be output at the end.</p>";
}

Cela a renvoyé le contenu de example_action_output (), mais a effacé le reste de mon shortcode. Aucune suggestion?

Merci Dalton

3
Dalton

Essaye ça:

function example_shortcode( $atts ) {

    $shortcode_output = "<p>Some shortcode content.</p>";
    $shortcode_output .= "<p>More shortcode content.</p>";

    ob_start();
        do_action('below_shortcode');
        $below_shortcode = ob_get_contents();
    ob_end_clean();

    $shortcode_output .= $below_shortcode

    return $shortcode_output;
}
4
KalenGi

Ma réponse inclurait une fonction de filtre qui ajoute le texte comme ceci:

add_shortcode('shortcode','example_shortcode');

function example_shortcode( $atts ) {

    $shortcode_output = "<p>Some shortcode content.</p>";
    $shortcode_output .= "<p>More shortcode content.</p>";

    $shortcode_output .= apply_filter('below_shortcode', $shortcode_output);

    return $shortcode_output;
}

add_filter('below_shortcode', 'example_action_output', 10, 1);

function example_action_output( $text = '' ) {
    return $text . "<p>This should be output at the end.</p>";
}
0
JandB65