web-dev-qa-db-fra.com

Changer la fonction du fichier de thème parent dans les thèmes enfants functions.php

im essayant de comprendre comment fonctionnent les filtres et les crochets d'action et avoir cet exemple que je veux éditer

Cette fonction est dans un fichier php framework de thème parent:

public function formatArticleCat01( $show_category = false, $shorten_text_chars = 300, $show_date = true, $show_comments = false, $show_author = false, $show_views = false ) {
$sFigure = ( $this->article_thumb != '' ) ? '<div class="col-sm-6 col-md-4 col-lg-5">'. $this->getReviewScore() .'' .$this->getFigureSmall() .'</div><div class="col-sm-6 col-md-8 col-lg-7">' : '<div class="col-xs-12">';
return '<div class="row clearfix">
            <!-- start:article.default -->
            <article class="def">
                '. $sFigure .'
                    <div class="entry">
                        '. ( $show_category ? $this->getCategoryLabelSpan() : '' ) .'
                        <h3 itemprop="name">
                            <a itemprop="url" href="'. get_permalink($this->article_link) .'">'. $this->article_title .'</a>
                        </h3>
                        <div class="entry-meta">
                            '. ( $show_date ? $this->getPostDateMeta() : '' ) .'
                            '. ( $show_author ? $this->getAuthorMeta() : '' ) .'
                            '. ( $show_comments ? $this->getCommentCountMeta() : '' ).'
                            '. ( $show_views  ? $this->getViewsLabelSpan() : '' ) .'
                        </div>
                        <div class="text hidden-xs">
                            '. MipThemeFramework_Util::ShortenText($this->article_content, $shorten_text_chars) .'
                        </div>
                        '. $this->getStarRatingLabelSpan() .'
                    </div>
                </div>
            </article>
            <!-- end:article.default -->
        </div>';
}

Alors disons que je veux ajouter une autre classe à cette div juste dans cette ligne

$sFigure = ( $this->article_thumb != '' ) ? '<div class="col-sm-6 col-md-4 col-lg-5">'. $this->getReviewScore() .'' .$this->getFigureSmall() .'</div><div class="col-sm-6 col-md-8 col-lg-7">' : '<div class="col-xs-12">';

Cela devrait fonctionner avec un crochet de filtre, non? Quelqu'un peut-il m'aider à comprendre la fonctionnalité des crochets de filtre et à faire fonctionner cet exemple?

Je ne sais pas quoi ajouter dans mon fichier functions.php du thème enfant pour éviter la perte des modifications lorsque je mets à jour le thème.

J'espère que quelqu'un peut m'aider

Merci

3
nameless

Les filtres servent à modifier les données, mais les actions ressemblent à des arrêts de bus où vous pouvez associer vos fonctions à un thème. Elles sont exécutées lorsque le script atteint un état spécifique.

Pour utiliser l'un des éléments ci-dessus, vous devez d'abord les déclarer quelque part. Jetons un coup d'oeil à cet exemple de la page de codex de apply_filters :

// Function that modifies the data
function example_callback( $string, $arg1, $arg2 ) {
    // (maybe) modify $string
    return $string;
}
// The filter used by user
add_filter( 'example_filter', 'example_callback', 10, 3 );

// Declaration of the filter by the person who 
$value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );

Comme vous pouvez le constater, le filtre est déclaré et nommé en utilisant $data = apply_filters( ... ). Ensuite, quelque part dans le code, il est appelé en utilisant add_filter( ... ). Par conséquent, si aucun filtre n'est déclaré attaché à ces données, vous ne pouvez pas filtrer cette donnée.

Maintenant à propos de votre code. Il semble que vous ayez saisi ce morceau de code dans une classe. La plupart des développeurs décents utilisent des fonctions connectables lorsqu'ils écrivent leur code. Cela signifie qu'ils définissent leurs classes et leurs fonctions comme suit:

if ( ! class_exists( 'some_class' ) {
    class some_class {
        // Class code here
    }
}

Cela permet à l'utilisateur de remplacer cette classe ou fonction spécifique, simplement en le définissant lui-même. Regardez votre code. Si vous suivez la même pratique, vous pouvez copier la classe dans le fichier functions.php de votre thème enfant et en modifier les parties de votre choix.

2
Jack Johansson

En termes simples, les filtres sont utilisés pour modifier ou changer une donnée existante telle que le contenu d'un article ou toute autre valeur définie. Les actions sur la main font quelque chose quand une chose particulière est exécutée.

Pour les actions et les filtres, vous devez d'abord les déclarer, c'est-à-dire que vous devez définir ce qui peut être modifié à l'aide d'un filtre, et pour les actions, ce qui entraînera l'exécution de l'action.

Remarque: Dans votre exemple ci-dessus, aucune filter n'est mentionnée. Par conséquent, le seul moyen de modifier cette fonction consiste à la copier dans le fichier function.php de votre thème enfant et à ajouter une classe manuellement.

Maintenant, pour comprendre le fonctionnement des filtres, regardons un exemple,

Supposons que vous souhaitiez imprimer le nom d'un auteur. Vous pouvez ensuite lui appliquer une variable filter afin que, si vous souhaitez modifier le nom de l'auteur, vous pouvez le faire sans modifier la fonction d'origine.

/*
 * - 'change_author_name_filter' is the filter hook $tag
 * - 'Digvijayad' is the value being filtered
$author_name = apply_filter('change_author_name_filter', 'Digvijayad');

Maintenant, si vous utilisez $author_name, il utilisera 'Digvijayad' comme nom d'auteur par défaut. Cependant, si vous ajoutez un filtre comme celui-ci.

// filter call_back
function change_author_name( $author_name ){
    //here you can do whatever you want to author name;
    // you can modify it or replace it altogether.

    // To print 'Digvijayad & Jack Johansson' you can do the following.
    // $author_name .= ' & Jack Johansson';

    // or you can replace it altogether. 
    $author_name = 'Jack Johansson';

    return $author_name;
}
add_filter('change_author_name_filter', 'change_author_name', 10, 1);

Maintenant, si vous utilisez $author_name, il sera remplacé par 'Jack Johansson'

Quant aux actions, elles déclenchent une réponse lorsque quelque chose est fait. Prenons Alarm comme analogie. Vous définissez d’abord une heure pour une alarme, puis, lorsque l’heure est atteinte, le réveil sonne pour vous indiquer qu’il est temps.

Maintenant, avec les actions, vous pouvez demander au réveil de faire d'autres choses, telles que "appeler un ami" également lorsque l'heure est atteinte. Maintenant, mettons ceci dans le code.

Supposons que vous avez déjà réglé l'heure, maintenant vous définissez un point d'ancrage do_action qui fera quelque chose quand le temps sera écoulé.

//code when time is checked
// and now time is up
do_action('time_is_up'); //basically it will perform this action when ever the time is up

maintenant, vous pouvez ajouter plus d'actions à cet événement particulier. Par analogie, vous pouvez maintenant lui dire d'appeler un ami lorsque les actions 'time_is_up' sont exécutées.

// Now Whenever 'time_is_up' runs this function will run as well
function call_friend(){
    //code for calling a friend;
    echo 'calling friend';
}
add_action('time_is_up', 'call_friend', 10);

De même, vous pouvez ajouter plusieurs actions au même crochet d’action 'time_is_up'. Par exemple, vous voulez peut-être aussi appeler le membre de votre famille

function call_my_family(){
   //code to call my family
   echo 'calling family';
}
add_action('time_is_up', 'call_my_family', 10);

Espérons que cette explication simple dissipe votre confusion sur les actions et les filtres.

Pour plus de lecture, vous pouvez lire Tom McFralin article sur Actions et filtres.

0
Digvijayad