I have some code that generates a dropdown list of all my post
files. I would like to add this dropdown to the top of every post page, right before the post content.
What's the correct hook/action to do so?
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');
The idea is that when a post
page is opened/viewed, this dropdown (made via create_post_dropdown
) will be added before the post content.
I have some code that generates a dropdown list of all my post
files. I would like to add this dropdown to the top of every post page, right before the post content.
What's the correct hook/action to do so?
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');
The idea is that when a post
page is opened/viewed, this dropdown (made via create_post_dropdown
) will be added before the post content.
1 Answer
Reset to default 1One way to do that is to have the custom dropdown function return
the custom html. Then you can call it inside your add_dropdown_to_posts
and put the returned content into a helper variable. After that just prepend the custom html to the $content
variable that the the_content filter provides.
Like this,
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' );