Tag Archives: Class

Plugin JetPack: what about with class Featured_Content from theme TwentyFourteen ?

Plugin JetPack has a strange behavior with class Featured_content of TwentyFourteen theme and child theme like here TwentyFourteen-xili!

Feedback after investigations

In TwentyFourteen, in sub-folder inc file featured-content.php contains class Featured_Content. It is possible to copy (and modify) inside child theme (as done in TwentyFourteen-xili to include sub-selection and cache according current language). As here in frontpage, only featured posts in a language are displayed. Because functions from functions.php are fired before those of parent theme: no problem, modified class has priority!

All is working well until JetPack will be installed… no sub-selection 🙁
By tracing, the modified class is not used
In JetPack settings, no way to disable (not load) Featured_Content Class, only a class with same name loaded before is possible !
How to force to download the child theme Featured_Content Class ?

In sources below (theme-tools.php – extrait ci-dessous) : no filter, only test with class_exists

// Featured Content has an internal check for theme support in the constructor.
// This could already be defined by Twenty Fourteen if it's loaded first.
// Be sure to not load this on the plugin page in case another plugin is activating
// with the same class name in an attempt to override Jetpack's Featured_Content
if ( ! class_exists( 'Featured_Content' ) && 'plugins.php' !== $GLOBALS['pagenow'] ) { 
    require_once( JETPACK__PLUGIN_DIR . 'modules/theme-tools/featured-content.php' );
}

Only possible solution, creating a plugin with a filter before the time where JetPack load the modules (plugins_loaded – priority 100).

Remember it is impossible to add filters “plugins_loaded” inside functions.php of a theme. It is too late according timeline of wp_settings.

The code below show that featured-content.php file will be required before JetPack requires its modules:

function xili_jetpack_disable_featured () {

    if ( ! class_exists( 'Featured_Content' ) && 'plugins.php' !== $GLOBALS['pagenow'] ) {
        if ( file_exists( get_stylesheet_directory() . '/inc/featured-content.php' ) ) {
            require get_stylesheet_directory() . '/inc/featured-content.php'; // this one will disable others
        }
    }
}

if ( class_exists ( 'jetpack' ) ) { // inited by init filter but without modules (priority 100 in jetpack)
    
    add_action( 'plugins_loaded', 'xili_jetpack_disable_featured', 17 ); // after XL and XTT

}

This example code lines are easy to insert in a very simple plugin.
For multilingual context, these lines (with options) are now inside xili-language (v 2.11.1+). Here, you will see in real time that TwentyFourteen-xili multilingual recovers his behavior and sub-select featured posts in frontpage.

M.

L’extension JetPack pas très “classe” avec la classe Featured_Content du thème TwentyFourteen

L’extension JetPack a un comportement inattendu avec la classe Featured_content du thème TwentyFourteen et des thèmes enfant.

Retour d’expérience

Dans le thème TwentyFourteen, il y a dans le sous-dossier inc le fichier featured-content.php qui contient la classe Featured_Content. Il est possible de la copier et modifier dans un thème enfant (ce qui se passe avec TwentyFourteen-xili pour intégrer la sélection – et le cache associé – selon la langue). Les articles (et images) en une correspondent donc au langage. Comme les fonctions du fichier functions.php du thème enfant sont actives avant celles du thème parent : pas de souci, la classe modifiée dans le thème enfant a priorité !

Tout fonctionne correctement jusqu’à ce que soit installée la récente version de JetPack qui, après de longues recherches pour localiser la cause, intègre maintenant la fameuse classe (semble-t-il utile à d’autres thèmes par exemple). Comment donc ne pas charger cette classe fournie par JetPack et garder celle du thème enfant ? Pas d’option prévue dans les réglages de JetPack qui en prévoit de nombreuses pour les modules proposés.
Dans le code idem (theme-tools.php – extrait ci-dessous) : pas de filtre spécifique à l’endroit où JetPack charge la classe.

// Featured Content has an internal check for theme support in the constructor.
// This could already be defined by Twenty Fourteen if it's loaded first.
// Be sure to not load this on the plugin page in case another plugin is activating
// with the same class name in an attempt to override Jetpack's Featured_Content
if ( ! class_exists( 'Featured_Content' ) && 'plugins.php' !== $GLOBALS['pagenow'] ) { 
    require_once( JETPACK__PLUGIN_DIR . 'modules/theme-tools/featured-content.php' );
}

Donc seule solution, créer une extension pour agir avant que JetPack activé via un filtre “init” lancent ses modules (plugins_loaded – priority 100).

En effet, on ne peut pas ajouter des filtres “plugins_loaded” dans functions.php d’un thème, c’est trop tard sur la ligne des temps de wp_settings.
L’objet du filtre est, en priorité inférieure à 100, d’installer la classe Featured_Content du thème courant. Ainsi, les tentatives suivantes seront repoussées car la classe choisie existe.

function xili_jetpack_disable_featured () {

    if ( ! class_exists( 'Featured_Content' ) && 'plugins.php' !== $GLOBALS['pagenow'] ) {
        if ( file_exists( get_stylesheet_directory() . '/inc/featured-content.php' ) ) {
            require get_stylesheet_directory() . '/inc/featured-content.php'; // this one will disable others
        }
    }
}

if ( class_exists ( 'jetpack' ) ) { // inited by init filter but without modules (priority 100 in jetpack)
    
    add_action( 'plugins_loaded', 'xili_jetpack_disable_featured', 17 ); // after XL and XTT

}

Cette partie de code est utilisable dans un plugin très simple à créer, mais, pour l’environnement multilingue, elle est insérée enrichie dans l’extension xili-language (v 2.11.1+) et il est donc possible d’avoir le thème comme ici et des fonctions JetPack comme ici.

M.