Menambahkan Related Posts ke Halaman Professor
Gambaran Umum
Video ini menampilkan sisi lain dari hubungan — di halaman detail professor, kita menampilkan daftar blog post yang meng-feature professor tersebut. Menggunakan the_content filter, meta_query pada WP_Query, dan file PHP terpisah.
Konsep
- Di halaman detail professor → tampilkan link ke blog post yang meng-feature professor ini
- Contoh output: "Dr. Barks A Lot is mentioned in the following posts:" diikuti daftar link
- Menggunakan metadata yang sudah kita simpan di video sebelumnya
- Ditambahkan ke akhir konten melalui filter
the_content
Menambahkan Filter di PHP Utama
Di Constructor
php
function __construct() {
add_action('init', [$this, 'onInit']);
add_action('rest_api_init', [$this, 'profHTML']);
add_filter('the_content', [$this, 'addRelatedPosts']);
}Method addRelatedPosts
php
function addRelatedPosts($content) {
if (is_singular('professor') && in_the_loop() && is_main_query()) {
return $content . relatedPostsHTML(get_the_ID());
}
return $content;
}Kondisi keamanan (3 checks):
| Fungsi | Tujuan |
|---|---|
is_singular('professor') | Hanya di halaman detail professor |
in_the_loop() | Hanya di dalam WordPress loop |
is_main_query() | Hanya untuk query utama (bukan sidebar/widget) |
Require File Baru
php
require_once plugin_dir_path(__FILE__) . 'inc/related-posts-html.php';File Template: related-posts-html.php
Kode Lengkap
php
<?php
function relatedPostsHTML($id) {
$postsAboutThisProf = new WP_Query(array(
'posts_per_page' => -1,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'featuredProfessor',
'compare' => '=',
'value' => $id
)
)
));
ob_start();
if ($postsAboutThisProf->found_posts) { ?>
<p><?php the_title(); ?> is mentioned in the following posts:</p>
<ul>
<?php while($postsAboutThisProf->have_posts()) {
$postsAboutThisProf->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php } ?>
</ul>
<?php }
wp_reset_postdata();
return ob_get_clean();
}Penjelasan Detail
WP_Query dengan meta_query
php
$postsAboutThisProf = new WP_Query(array(
'posts_per_page' => -1, // Ambil semua
'post_type' => 'post', // Hanya blog post standar
'meta_query' => array(
array(
'key' => 'featuredProfessor', // Nama meta key
'compare' => '=', // Exact match
'value' => $id // Professor post ID
)
)
));Apa yang terjadi di database:
- WordPress mencari di tabel
wp_postmeta - Cari semua row dimana
meta_key = 'featuredProfessor'DANmeta_value = $id - Ambil
post_iddari row tersebut → itu adalah blog post yang meng-feature professor ini
Cek found_posts
php
if ($postsAboutThisProf->found_posts) {found_posts= jumlah total post yang ditemukan- Jika 0 → evaluasi
false→ tidak tampilkan apa-apa - Jika > 0 → evaluasi
true→ tampilkan daftar
Output Buffering Pattern
php
ob_start();
// ... HTML output ...
wp_reset_postdata();
return ob_get_clean();- Pattern yang sama seperti
generateProfessorHTML() ob_start()→ mulai tangkap output- HTML ditulis langsung (keluar PHP tag)
wp_reset_postdata()→ kembalikan global post ke main queryob_get_clean()→ ambil semua output sebagai string & bersihkan buffer