it-swarm.com.ru

Изменить функцию файла родительской темы в дочерних темах functions.php

я пытаюсь понять, как Action Hooks и фильтры работают, и этот пример я хочу редактировать

Эта функция находится в php-файле фреймворка родительской темы:

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>';
}

Допустим, я хочу добавить еще один класс к этому div только в этой строке

$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">';

Это должно работать с крючком фильтра, верно? Может кто-нибудь помочь мне понять функциональность фильтров и заставить этот пример работать

Я понятия не имею, что добавить в мой файл functions.php дочерней темы, чтобы предотвратить потерю изменений при обновлении темы.

Надеюсь, кто-нибудь может мне помочь

Спасибо

3
nameless

Фильтры предназначены для изменения данных, но действия похожи на автобусные остановки, где вы можете прикрепить свои функции к теме, и они будут запущены, когда сценарий достигнет определенного состояния.

Чтобы использовать любой из вышеперечисленных, они должны быть сначала объявлены где-то. Давайте посмотрим на этот пример со страницы кодекса 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 );

Теперь, как вы можете видеть, фильтр объявлен и получил имя с помощью $data = apply_filters( ... ). Затем, где-то еще в коде это вызывается с помощью add_filter( ... ). Таким образом, если у вас нет объявленного фильтра, прикрепленного к этим данным, вы не сможете отфильтровать этот фрагмент данных.

Теперь о вашем коде. Похоже, вы взяли этот кусок кода из класса. Большинство приличных разработчиков используют подключаемые функции, когда пишут свой код. Это означает, что они определяют свои классы и функции следующим образом:

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

Это позволяет пользователю переопределять этот конкретный класс или функцию, просто определяя его сам. Посмотрите на свой код. Если он придерживается той же практики, то вы можете скопировать класс в файл functions.php своей дочерней темы и изменить его части, которые хотите.

2
Jack Johansson

В терминах непрофессионала Фильтры используются для изменения или изменения существующих данных, таких как содержание сообщения или любое другое определенное значение. Действия на руке делают что-то, когда выполняется конкретная вещь.

Как для действий, так и для фильтра вы должны сначала объявить их, т. Е. В случае фильтров вы должны определить, что можно изменить с помощью фильтра, и для действий перехватывает то, что вызовет действие.

Примечание: В приведенном выше примере нет упоминания о какой-либо filter, поэтому единственный способ изменить эту функцию - это скопировать ее в файл function.php вашей дочерней темы и добавить класс вручную.

Теперь, чтобы понять, как работают фильтры, давайте рассмотрим пример,

Допустим, вы хотите напечатать имя автора, затем вы можете применить к нему filter, чтобы в случае, если вы хотите изменить имя автора, вы могли сделать это без изменения исходной функции.

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

Теперь, если вы используете $author_name, тогда он будет использовать 'Digvijayad' в качестве имени автора по умолчанию. Однако, если вы добавите фильтр, как показано ниже.

// 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);

Теперь, если вы используете $author_name, он будет заменен на 'Jack Johansson'

Что касается действий, они вызывают ответ, когда что-то сделано. давайте возьмем сигнализацию в качестве аналогии. Сначала вы устанавливаете время для будильника, и когда время истекло, будильник воспроизводит звук, сообщающий вам, что время пришло.

Теперь с действиями, вы можете сказать будильнику делать другие вещи, такие как "позвонить другу", когда время истекло. Теперь давайте поместим это в код.

Давайте предположим, что вы уже установили время, теперь вы установите хук do_action, который будет что-то делать, когда время истечет.

//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

теперь вы можете добавить больше действий для этого конкретного события. Исходя из аналогии, теперь вы можете сказать, чтобы он вызывал друга, когда выполняются действия time_is_up.

// 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);

Вы также можете добавить больше действий к тому же хуку действий 'time_is_up'. Например, может быть, вы также хотите позвонить члену вашей семьи

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

Надеюсь, это простое объяснение прояснит вашу путаницу в отношении действий и фильтров.

Для получения дополнительной информации вы можете прочитать статью Tom McFralin's "Действия и фильтры".

0
Digvijayad