web-dev-qa-db-fra.com

Comment remplacer une fonction de thème (au sein d'une classe) à l'aide d'un plugin

Je travaille sur un site Web qui utilise un thème très complexe (essentiellement tout un ensemble de logiciels associés à Wordpress), si complexe en fait que les thèmes pour enfants ne fonctionneront pas.

Je veux remplacer une fonction (à l'intérieur d'une classe) dans le thème en utilisant un plugin de fonctionnalité. Lorsque je fais référence à la classe depuis le plug-in, je reçois le message d'erreur suivant:

Erreur irrécupérable: la classe 'OptimizePress_Default_Asset' ne figure pas dans [expurgé]\wp-content\plugins\functions.php à la ligne 17

class Foo extends OptimizePress_Default_Asset {
   function recent_posts($atts){

        // Decode encoded chars
        $atts = op_urldecode($atts);

        extract(shortcode_atts(array(
            'style' => '',
            'posts_num' => ''
        ), $atts));

        //Get recent posts
        $recent_posts = wp_get_recent_posts(array(
            'numberposts' => $posts_num,
            'post_status' => 'publish'
        ));
        $recent_html = '';
        foreach( $recent_posts as $recent ){
            $img_src = wp_get_attachment_image_src(get_post_thumbnail_id($recent['ID']), 'single-post-thumbnail');
            $img_src = $img_src[0];
            if ( is_front_page() ) {
                $date = "";
            }
            else {
                $date = '<span>'.date(OP_DATE_POSTS, strtotime($recent['post_date'])).'</span>';
            }   
            $recent_html .= '<li><div class="thumb"><img src="'.$img_src.'" class="scale-with-grid" /></div><div class="content"><a href="'.get_permalink($recent["ID"]).'">'.$recent["post_title"].'</a>'.$date.'</div></li>';

        }

        return '
            <ul class="recent-posts-style-'.$style.'">
                '.$recent_html.'
            </ul>
        ';
    }
}

Est-il possible de faire référence à une classe dans un thème à partir d'un plugin? Si oui, comment cela peut-il être fait? Est-ce quelque chose qui doit être mentionné après la configuration du thème?

Merci d'avance

3
Tom

Vous devez savoir que le thème enfant functions.php est chargé avant le thème parent functions.php.

Cela signifie qu'à l'intérieur d'un thème enfant, les classes de thème parent functions.php ne sont pas encore disponibles. Vous obtenez donc cette erreur fatale.

Si la classe est dans le thème parent functions.php, vous pouvez utiliser 'after_setup_theme' hook pour attendre que la classe de thème parent soit définie:

add_action('after_setup_theme', function() {
  // assuming class-foo.php is the file that contains your Foo class
  require_once get_stylesheet_directory() . '/class-foo.php';
});

Cependant, le code ci-dessus peut ne pas fonctionner car il suppose que la classe de thème parent est chargée immédiatement lorsque le thème parent functions.php est chargé, mais si cette classe est chargée à l'aide d'un hook différent, vous devez attendre que ce hook soit activé, au lieu de 'after_setup_theme'.

Par exemple, si votre thème parent contient quelque chose comme:

add_action('init', function() {
  // assuming class-optimizepress-default-asset.php is the file that contain the class
  require_once get_template_directory() . '/class-optimizepress-default-asset.php';
});

vous devez attendre que le hook 'init' soit activé avant de charger votre classe. Dans ce cas, vous pouvez utiliser le même hook 'init' avec une priorité inférieure:

add_action('init', function() {
  require_once get_stylesheet_directory() . '/class-foo.php';
}, 99); // default priority is 10, higher number means lower priority

En résumé, il n'y a pas de code qui fonctionne pour toutes les classes et tous les thèmes, vous devez examiner le code du thème parent pour comprendre quel est le hook approprié à utiliser pour vous assurer que la classe de thème parent est disponible.

4
gmazzap