web-dev-qa-db-fra.com

Insérer automatiquement une fonction php dans post $ the_content

J'essaie d'avoir 2 fonctions php automatiquement insérées dans chaque poste pour mon CPT. Le problème que j'ai est que, même si j'ai trouvé un moyen d'ajouter du texte, je ne suis pas sûr de savoir comment ajouter les fonctions php parce que le code que je possède l'ajoute en tant que texte normal à la publication.

C'est ce que j'ai dans mon fichier de fonctions ---

    add_filter( 'default_content', 'my_editor_content', 10, 2 );

    function my_editor_content( $content, $post ) {

        switch( $post->post_type ) {
            case 'property':
 $content = "<div>";
                $content . "<?php if ( class_exists( 'MRP_Multi_Rating_API' ) ) {
        MRP_Multi_Rating_API::display_rating_result( array(
                'rating_item_ids' => 2,
                'show_count' => false,
                'result_type' => 'value_rt',
    'no_rating_results_text' => 'Not Rated'
        ) ); } ?><?php if ( class_exists( 'MRP_Multi_Rating_API' ) ) {
        MRP_Multi_Rating_API::display_rating_result( array(
                'rating_item_ids' => 5,
                'show_count' => false,
                'result_type' => 'overall_rt',
    'no_rating_results_text' => 'Not Rated'
        ) );
    } ?>";
 $content = "</div>";
            break;
            default:
                $content = "your default content";
            break;
        }

        return $content;
    }

Comment puis-je résoudre ce problème pour que mes fonctions fonctionnent et est-il possible de le faire ajouter à chaque message, pas seulement aux nouveaux créés?

Merci

2
Rich

Utilisez shortcodes pour ajouter une fonctionnalité php dans la zone de contenu. Ou, ob_start () et ob_get_clean () pour capturer le résultat et l'ajouter au $ contenu que vous retournez.


Le filtre "the_content" est utilisé pour filtrer le contenu de la publication après son extraction de la base de données et avant son impression à l'écran.

add_filter( 'the_content', 'my_the_content_filter', 20 );

function my_the_content_filter($content) {

    $post = $GLOBALS['post'];

    ob_start();

    switch($post->post_type) {
        case 'property':
            if(class_exists('MRP_Multi_Rating_API')) {
                MRP_Multi_Rating_API::display_rating_result(array(
                                                                'rating_item_ids'        => 2,
                                                                'show_count'             => false,
                                                                'result_type'            => 'value_rt',
                                                                'no_rating_results_text' => 'Not Rated',
                                                            ));

                MRP_Multi_Rating_API::display_rating_result(array(
                                                                'rating_item_ids'        => 5,
                                                                'show_count'             => false,
                                                                'result_type'            => 'overall_rt',
                                                                'no_rating_results_text' => 'Not Rated',
                                                            ));
            }
            break;
    }

    $extra = ob_get_clean();

    if( ! empty($extra)) {
        return "<div>" . $content . $extra . "</div>";
    }

    return $content;
}

Si vous voulez simplement insérer des éléments dans le contenu, utilisez str_replace sur le $ post.

$post = get_post(37);

// Update post 37
$my_post = array(
    'ID'           => $post->ID,
    'post_content' => str_replace('round hole', 'square peg' . ' round hole', $post->post_content),
);

// Update the post into the database
wp_update_post($my_post);
1
jgraup

Je suis sûr que vous souhaitez utiliser le filtre the_content au lieu du filtre default_content (déjà mentionné par @jgraup), car que se passe-t-il si le code HTML modifié change? Ensuite, vous êtes coincé avec cela dans votre contenu. Il vaut mieux l'ajouter dynamiquement. Voici une suggestion:

add_filter( 'the_content', function( $content)
{
    if( ! in_the_loop() )
        return $content;

    if( 'property' !== get_post_type() )
        return $content;

    $args = [
        'rating_item_ids'           =>  2,
        'show_count'                => false,
        'result_type'               => 'value_rt',
        'no_rating_results_text'    => 'Not Rated',
        'echo'                      => 0,
    ];

    if ( class_exists( 'MRP_Multi_Rating_API' ) ) 
    {
        $content .= MRP_Multi_Rating_API::display_rating_result( $args ); 

        // Modify arguments for the second run
        $args['rating_item_ids'] = 5;
        $args['result_type']     = 'overall_rt';

        $content .= MRP_Multi_Rating_API::display_rating_result( $args ); 
    }

    return $content;
} );

Notez que nous utilisons le in_the_loop check (ici, je vous renvoie à la question de @PieterGoosen et à la réponse de @gmazzap), car je suppose que vous ne voulez pas que cela soit ajouté à chaque partie du contenu de votre site.

De plus, vous n'avez pas besoin de vérifier deux fois l'existence de la même classe.

Notez que cela a une grosse hypothèse, à savoir l'attribut echo ;-)

1
birgire