concrètement c'est similaire à ta solution 3, le code est mis à part dans une fonction et utilisé dans les deux cas
après, mon fw simplifie le chargement et l'appel de la fonction en y mettant une syntaxe particulière §nom-plugin|arg1|arg2|..argN§ et en séparant bien la fonction du code du moteur en le calant dans un répertoire et fichier particulier.
donc j'ai juste à inclure l'appel du plugin dans la grosse page, du moins dans son contenu réel, le moteur remplira l'ensemble de la page suivant son squelette, et appellera le plugin lui même, pour la page ajax ce sera pareil mais avec un squelette de page "vide"
après comme tu le dit en
./1 j'utilise accessoirement un système de cache, soit sur la page elle même soit sur l'appel au plugin, de plus j'utilise redis, qui permet de supprimer automatiquement une clef au bout d'un certain temps si nécessaire (ici ca buterais le cache des 30 derniers posts toute 30 secondes par exemple)