web-dev-qa-db-fra.com

Ajouter une fonction à chaque poste?

J'ai du code qui génère une liste déroulante de tous mes fichiers post. J'aimerais ajouter ce menu déroulant en haut de chaque page de message, juste avant le contenu du message.

Quelle est la bonne action/action pour le faire?

custom-functions.php:

<?php
function create_post_dropdown($titles){
    ?>
    <div id="article-choice">
    <h3>Choose an Article, or browse below</h3>
    <select onchange="if (this.value) window.location.href=this.value">
        <?php 
        foreach($titles as $title => $url){
            echo "<option value=" . $url . ">" . $title . "</option>";
        } 
        ?>
    </select>
    </div>
    <?php
}
add_action('__after_header', 'create_post_dropdown');
function add_dropdown_to_posts(){
    $args = [
             'post_type' => 'post',
             'post_status' => 'publish',
             'posts_per_page' => -1
        ];
    $posts = new WP_Query( $args );
    $titles = get_post_titles($args);
    if (get_post_type() == "post"){
        $title = $post->post_title; // get_the_title();
        $title = create_post_dropdown($titles) . "<br>" . $title;
    }
    return $title;
}
add_filter('the_content', 'add_dropdown_to_posts');

L'idée est que lorsqu'une page post est ouverte/affichée, cette liste déroulante (créée via create_post_dropdown) sera ajoutée avant le contenu de l'article.

1
BruceWayne

Une façon de le faire est d’avoir la fonction déroulante personnalisée return le code HTML personnalisé. Ensuite, vous pouvez l'appeler dans votre add_dropdown_to_posts et placer le contenu renvoyé dans une variable d'assistance. Ensuite, ajoutez simplement le code HTML personnalisé à la variable $content fournie par le filtre the_content .

Comme ça,

function my_custom_dropdown_html() {
 return '<html stuff here>'; // you could put your html also in a variable and then return that.
}
function add_dropdown_html_before_the_content($content) {
 $dropdown = my_custom_dropdown_html();
 // if statement just to be safe - e.g you change the custom function output to something else than string of html and forget you've used it here
 if ( $dropdown && is_string( $dropdown ) ) {
  $content = $dropdown . $content; // prepend custom html to content
 }
 return $content;
}
add_filter( 'the_content', 'add_dropdown_html_before_the_content' );
1
Antti Koskinen