Creo que está mal enfocado. Primero, hay fallos en el código, no sé si los has visto. Segundo, estás intentando sacar posts dentro de un plugin y WordPress no detecta eso como una plantilla (index, archivos, single, etc…) por lo que have_posts() devuelve false. La query tendrías que hacerla de forma manual con WP_Query y piensa que no querrás ejecutar esa función cada vez que WordPress se cargue. Podrían existir muchos tags y muchos posts y ralentizaría mucho la carga. Lo mejor es que guardes los tags en la base de datos y cuando se cree un nuevo tag, lo vuelves a generar. No sé si me explico. Te paso el código que he hecho pero esta última comprobación no la incluyo. Si necesitas más ayuda pregunta:
add_action( 'init', 'cus_post' );
function cus_post(){
// Obtenemos todos los tags
$tags = get_tags();
// Para cada tag, obtenemos los posts asociados
$tags_arr = array();
foreach ( $tags as $tag ) {
// Los argumentos son: búscame los posts que estén etiquetados con un tag cuyo ID sea $tag->term_id
$args = array(
'tag_id' => $tag -> term_id
);
$the_query = new WP_Query( $args );
// Si hay más de 5 posts asociados, gúardamos los datos de ese
if ( $the_query -> post_count > 5 ) {
$tags_arr[] = $tag;
}
}
// Ahora, en $tags_arr tenemos los datos de todos los tags asociados a más de 5 posts
// Para cada nombre de los tags creamos un custom post type
foreach ( $tags_arr as $tag ) {
// Labels. El problema es que no podremos internacionalizarlo
$labels = array(
'name' => $tag -> name,
'singular_name' => $tag -> name,
'add_new' => sprintf( __( 'Add New %s', 'your_text_domain' ), $tag -> name ),
'add_new_item' => sprintf( __( 'Add New %s', 'your_text_domain' ), $tag -> name ),
'edit_item' => sprintf( __( 'Edit %s', 'your_text_domain' ), $tag -> name ),
'new_item' => sprintf( __( 'New %s', 'your_text_domain' ), $tag -> name ),
'all_items' => sprintf( __( 'All %s', 'your_text_domain' ), $tag -> name ),
'view_item' => sprintf( __( 'View %s', 'your_text_domain' ), $tag -> name ),
'search_items' => sprintf( __( 'Search %s', 'your_text_domain' ), $tag -> name ),
'not_found' => sprintf( __( 'No %s found', 'your_text_domain' ), $tag -> name ),
'not_found_in_trash' => sprintf( __( 'No %s found in Trash', 'your_text_domain' ), $tag -> name ),
'parent_item_colon' => '',
'menu_name' => sprintf( __( '%s', 'your_text_domain' ), $tag -> name ),
);
// Argumentos. Ten en cuenta que el slug del custom post type no puede ser el nombre porque podría llevar caracteres raros
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
);
register_post_type( $tag -> slug, $args);
}
}