Zufälliger WP-Beitrag anzeigen – Cache umgehen

PHP
<?php
// Exit if accessed directly
if (!defined('ABSPATH')) {
    exit;
}

/**
 * AJAX Handler - Random Post
 * Wiederverwendbar für beliebige Post Types
 */
function gw_get_random_post() {
    global $wpdb;
    
    // POST TYPE HIER ANPASSEN
    $post_type = 'post'; // z.B. 'post', 'portfolio', 'testimonial'
    
    $post_id = $wpdb->get_var(
        $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} 
            WHERE post_type = %s 
            AND post_status = %s 
            ORDER BY RAND() 
            LIMIT 1",
            $post_type,
            'publish'
        )
    );
    
    if ($post_id) {
        // FELDER HIER ANPASSEN
        $data = array(
            'id' => $post_id,
            'title' => get_the_title($post_id),
            'permalink' => get_permalink($post_id),
            'excerpt' => get_the_excerpt($post_id),
            'thumbnail' => get_the_post_thumbnail_url($post_id, 'medium'),
            // ACF Felder falls nötig:
            // 'custom_field' => get_field('field_name', $post_id),
        );
        
        wp_send_json_success($data);
    }
    
    wp_send_json_error('Kein Beitrag gefunden');
}
add_action('wp_ajax_gw_get_random_post', 'gw_get_random_post');
add_action('wp_ajax_nopriv_gw_get_random_post', 'gw_get_random_post');

/**
 * Shortcode - Container
 */
function gw_random_post_shortcode() {
    return '<div id="random-post-container">
        <div class="spinner"></div>
    </div>';
}
add_shortcode('random-post', 'gw_random_post_shortcode');

/**
 * JavaScript im Footer
 */
function gw_random_post_script() {
    $ajax_url = admin_url('admin-ajax.php');
?>
<script>
document.addEventListener("DOMContentLoaded", function () {
    const container = document.getElementById('random-post-container');
    if (!container) return;
    
    const data = new FormData();
    data.append('action', 'gw_get_random_post');
    
    fetch('<?php echo esc_url($ajax_url); ?>', {
        method: 'POST',
        body: data
    })
    .then(res => res.json())
    .then(result => {
        if (result.success) {
            container.innerHTML = buildPostHTML(result.data);
        } else {
            container.innerHTML = '<p>Fehler beim Laden.</p>';
        }
    })
    .catch(error => {
        container.innerHTML = '<p>Fehler beim Laden.</p>';
        console.error('AJAX Error:', error);
    });
    
    function buildPostHTML(data) {
        // HTML STRUKTUR HIER ANPASSEN
        let html = '<div class="random-post-card">';
        
        if (data.thumbnail) {
            html += `<img src="${data.thumbnail}" alt="${data.title}">`;
        }
        
        html += `<h3><a href="${data.permalink}">${data.title}</a></h3>`;
        
        if (data.excerpt) {
            html += `<p>${data.excerpt}</p>`;
        }
        
        html += `<a href="${data.permalink}">Mehr lesen</a>`;
        html += '</div>';
        
        return html;
    }
});
</script>
<?php
}
add_action('wp_footer', 'gw_random_post_script');