Listar todas las categorías con las etiquetas y los posts que contienen php

                  <?php
/***
  Este código recupera todas las categorías y las etiquetas, y luego busca todos los posts que pertenecen a cada combinación de categoría y etiqueta.
  Luego, muestra los títulos de los posts con enlaces a ellos, junto con las categorías a las que pertenecen.

Cada categoría se muestra como un encabezado <h2>, y las etiquetas se muestran como elementos de una lista <ul>. 
Los posts se muestran como elementos de lista <li> debajo de cada etiqueta.

**/
$categories = get_terms( array(
    'taxonomy' => 'category',
    'hide_empty' => false,
) );

foreach ( $categories as $category ) {
    echo '<h2>' . $category->name . '</h2>';
    echo '<ul>';

    $tags = get_terms( array(
        'taxonomy' => 'post_tag',
        'hide_empty' => false,
    ) );

    foreach ( $tags as $tag ) {
        $args = array(
            'post_type' => 'post',
            'posts_per_page' => -1,
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'term_id',
                    'terms' => $category->term_id,
                ),
                array(
                    'taxonomy' => 'post_tag',
                    'field' => 'term_id',
                    'terms' => $tag->term_id,
                ),
            ),
        );
        $posts = get_posts( $args );

        if ( $posts ) {
            echo '<li>' . $tag->name . ': ';
            foreach ( $posts as $post ) {
                $post_terms = wp_get_post_terms( $post->ID, 'category' );
                $post_categories = array();
                foreach ( $post_terms as $post_term ) {
                    $post_categories[] = $post_term->name;
                }
                echo '<a href="' . get_permalink( $post->ID ) . '">' . $post->post_title . '</a> (' . implode( ', ', $post_categories ) . ') ';
            }
            echo '</li>';
        }
    }
    echo '</ul>';
}
?>