web-dev-qa-db-ja.com

子テーマのfunctions.phpで親テーマファイルの機能を変更する

アクションフックとフィルタがどのように機能し、この例を編集したいのかを理解しようとしているim

この関数は、親テーマフレームワークの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'に置き換えられます。

アクションに関しては、何かが行われると応答を引き起こします。同様にAlarmを取ることができます。最初にアラームの時間を設定し、その時間に達すると、目覚まし時計が音を鳴らしてそれが時間であることを知らせます。

行動を起こさせることで、時間が来たときに「友人に電話をかける」などの他のことをするように目覚まし時計に指示することができます。それでは、これをコードに入れてみましょう。

あなたはすでに時間を設定していると仮定しましょう、今度は時間が来たときに何かをする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の アクションとフィルタに関する記事を参照してください。

0
Digvijayad