web-dev-qa-db-fra.com

Comment filtrer the_content () et inclure le contenu du modèle

J'essaie de filtrer the_content() sur une seule page, mais il semble que cela crée une boucle infinie. Je veux savoir comment résoudre ce problème. Je veux remplacer the_content().

Existe-t-il un autre moyen de remplacer le contenu d'une seule page à partir du plugin?

add_filter( 'the_content', 'change_single_content' );
function change_single_content($content){
    global $post;

    if ( 'my-CPT' == get_post_type() && is_single() ){
        ob_start();
        include my_plugin_theme('single-template.php'); //include single template content
        return ob_get_clean();
    }

    return $content;
}
1
user1983017

Je suppose que single-template.php utilise the_content. Maintenant, pensez à ce qui se passe:

  1. Votre filtre provoque le chargement de single-template.php
  2. single-template.php utilise the_content
  3. Donc single-template.php charge à nouveau
  4. Qui utilise the_content
  5. Quels chargements single-template.php
  6. Qui utilise the_content
  7. ...

Je ne suis pas tout à fait sûr de savoir comment résoudre ce problème, car votre question est assez détaillée. Il est difficile de dire ce que la plupart du code fait ou quel est votre but ultime, mais cela peut être aussi simple que de supprimer le filtre de manière conditionnelle:

add_filter( 'the_content', 'change_single_content' );
function change_single_content($content){
    global $post;

    if ( 'my-CPT' == get_post_type() && is_single() ){
        remove_filter( 'the_content', 'change_single_content' ); // this !!
        ob_start();
        include my_plugin_theme('single-template.php'); //include single template content
        return ob_get_clean();
    }

    return $content;
}

Je suis également à peu près sûr que ce que vous faites est la mauvaise façon, ou du moins la moins bonne, de faire ce que vous essayez de faire. Je ne peux pas le prouver, mais mon sens de l'araignée pique quelque chose de terrible.

2
s_ha_dum
add_filter( 'the_content', 'filter_content' );
function filter_content( $content ){
    if ( is_single() ){
        $new_content = str_replace( 'for', 'FOR', $content );
        return $new_content;
    }
    else
    {
        return $content;
    }
}

Essaye ça. J'ai essayé de remplacer the_content sur un seul post. Il remplace mais pas sur la page d'index en raison de la condition is_single().

Vous pouvez le modifier selon vos besoins.

Le problème avec votre code est que vous acceptez $content en tant que paramètre et que vous renvoyez ob_get_clean(). Vous devez renvoyer $content après l'avoir modifié, dans ce scénario.

Comme dans le code ci-dessus, j'ai accepté $content, l'ai modifié et renvoyé $new_content.

0
Sudeep K Rana