web-dev-qa-db-fra.com

Les fonctions de shortcode sont-elles appliquées lors du rendu du contenu, ou sont-elles exécutées et stockées avec le contenu de publication?

Je ne suis pas sûr d'avoir posé la question correctement, excusez-moi! Ce que j'essaie de faire est de générer une balise <!--nextpage--> via un shortcode. Mais cela ne fonctionne pas, je suppose, car les codes courts sont appliqués lors du rendu du contenu, alors que <!--nextpage--> est résolu au préalable en liens. Est-ce que quelqu'un sait si cela peut être fait? Puis-je appliquer la balise <!--nextpage--> via mon shortcode lors du rendu de l'article?

1
Rutwick Gangurde

Je ne sais pas dans quel ordre exact les filtres sont appliqués à the_content(); et si c'est assez tôt, mais si cela ne fonctionne pas pour vous, je pense qu'il est prudent de supposer que vous avez raison de penser que le code abrégé est appliqué à en retard.

De /wp-includes/shortcodes.php (ligne 296, wp 3.2.1), on peut voir que les codes courts sont naturellement résolus de la manière suivante:

add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()

Si vous exécutez do_shortcode lorsque le hook the_posts est exécuté, vous devez vous assurer qu’ils ont été exécutés suffisamment tôt. the_posts est exécuté immédiatement après la récupération des publications dans la base de données. Ce qui suit devrait fonctionner:

add_filter('the_posts', 'rutwick_shortcode_exec');

function rutwick_shortcode_exec($posts) {
    $post_count = count($posts);
    for ($i = 0; $i < $post_count; ++$i) {
        do_shortcode($posts[$i]->post_content);
    }
    return $posts;
}

Il se peut que réduire la priorité suffise:

add_filter('the_content', 'do_shortcode', 9);

Notons que je n’ai pas testé ce qui précède et que je ne garantis rien. Vous pouvez également rencontrer des conflits avec wpautop , car si ce qui précède est appliqué, les codes courts (tous les codes courts!) Sont maintenant résolus avant qu’ils ne filtrent le contenu.

EDIT: Il serait peut-être plus sûr de lancer votre propre fonction de remplacement plus tôt (ce qui suit supposera que votre shortcode s'appelle [next]):

function do_rutwick_shortcode($content) {
    $content = preg_replace('{\[next\]}','<!--nextpage-->',$content);
    return $content;
}

et appelez-le en utilisant l’une des méthodes ci-dessus (c’est-à-dire raccordez-le à the_content avec un numéro de priorité inférieur ou remplacez do_shortcode(...) par do_rutwick_shortcode(...) dans la boucle for ci-dessus). Si vous choisissez de le faire, utiliser add_shortcode devient superflu. De même, si vous optez pour l’accrochage dans the_posts, le preg_replace peut être exécuté directement dans ladite fonction, deux ne seront pas nécessaires, à savoir:

$posts[$i]->post_content =
    preg_replace('{\[next\]}','<!--nextpage-->',$posts[$i]->post_content);

vous sauverait un appel de fonction.

4
Johannes Pille