Я узнал, почему это не работает.
В single.php Timber :: render искал $ post-> ID и $ post-> post_type и не искал $ post-> post_name.
Теперь работает.
Я так много возился, что не помню, есть ли это в первоначальной теме стартера Timber, но вот код на случай, если кто-то столкнется с той же проблемой.
$context = Timber::get_context();
$post = Timber::query_post();
$context['post'] = $post;
$context['sidebar'] = Timber::get_sidebar('sidebar.php');
if ( post_password_required( $post->ID ) ) {
Timber::render( 'single-password.twig', $context );
} else {
Timber::render( array( 'single-' . $post->post_name . '.twig', 'single-' . $post->ID . '.twig', 'single-' . $post->post_type . '.twig', 'single.twig' ), $context );
}