web-dev-qa-db-ja.com

ショートコード属性の拡張

私は多くの場所を捜して、これのために多くの方法を試みました、しかし、成功しませんでした。

私のWPテーマにはショートコードがあります。

[recent_posts layout="thumbnails-on-side" columns="4" number_posts="4" offset="" cat_slug="" exclude_cats="" thumbnail="yes" title="no" meta="no" excerpt="no" excerpt_length="35" strip_html="yes" animation_type="0" animation_direction="down" animation_speed="0.1" class="" id=""][/recent_posts]

(Avadaテーマの最近の投稿のショートコードです)。コアでは、このショートコードが実行されます。

WP_Query( $args )

投稿を取得する機能。しかし、このショートコードはカスタム投稿タイプでは使用できません。なぜなら、コーダーはshortcode $ argsに 'post_type'属性を付けていないからです(デフォルト値は 'posts'なので、ショートコードは標準投稿のみを取得します)。

結果として、変数として 'post_type'属性を追加するための、このショートコードの新しい拡張バージョンを拡張/定義したいと思います。多くのカスタム投稿タイプに使用します。どうやってやるの?ありがとう。

2
Alper

コードを見なくても、正確な答えを得ることは困難です。 Wordpress 3.6で導入されたshortcode_atts_{$shortcode}フィルタがあります。すべての属性はこのフィルタを通して実行されます。 $shortcodeパラメータは shortcode_atts に設定する必要があることに注意してください。このパラメータが設定されているショートコードはまだ見たことがありません。

ここでのあなたの問題は実際にはあなたがあなたのクエリ引数に属性とpost_typeパラメータを追加する必要があるので属性だけより大きいです。作成者がクエリ引数にカスタムフィルタを指定しなかった場合は、行き止まりになります。

IMO、ここに2つの選択肢があります

  • テーマの作者に連絡して、彼の次のアップデートで関連するコードをショートコードにするように依頼してください。これがショートコードに付加価値を与えるので、彼/彼女には問題があるとは思わない。

  • 子テーマを作成し、そのショートコードを子テーマにコピーします。必要に応じてショートコードを修正し、それに応じて関数名とショートコード名を変更することを忘れないでください。このようにあなたはあなたのニーズに合うショートコードを持つことになります

4
Pieter Goosen

これは@PieterGoosenによる答えへの単なる追加です。

ショートコードの中にあるWP_Query投稿タイプを変更する方法がいくつかあります。 [recent_posts]だとしましょう。

方法A)ショートコードがshortcode_atts()の3番目のパラメーターを使用する場合(@PieterGoosenが述べたように)、例えばwpse

/**
 * Method A: Using the shortcode_atts_$shortcode filter + pre_get_posts action
 */

add_filter( 'shortcode_atts_wpse', function ( $out, $pairs, $atts )
{
    if( isset( $atts['post_type'] ) && $post_type = $atts['post_type'] )
    {
        add_action( 'pre_get_posts', function ( $q ) use ( $post_type )
        {
            static $activated = false;
            if( ! $activated )
            {
                $q->set( 'post_type', santize_key( $post_type ) );
                $activated = true;
            }
        }
    }       
    return $out;
} );

ここで このフィルタの使い方に関する私の他の答えを見ることができます。

方法B)そうでなければ、新しいコールバックでショートコードを再登録することができます。

old_recent_postsからnew_recent_postsに変更してください。

/**
 * Method B: Re-register the shortcode
 */

add_action( 'after_setup_theme', function()
{
    if( function_exists( 'old_recent_posts' ) )
    {
        remove_shortcode( 'recent_posts', 'old_recent_posts' );
        add_shortcode(    'recent_posts', 'new_recent_posts' );
    }

} );

function new_recent_posts( $atts = [], $content = '' )
{
    if( isset( $atts['post_type'] ) && $post_type = $atts['post_type'] )
    {
        add_action( 'pre_get_posts', function ( $q ) use ( $post_type )
        {
            static $activated = false;
            if( ! $activated )
            {
                $q->set( 'post_type', santize_key( $post_type ) );
                $activated = true;
            }
        }
    }       
    return old_recent_posts( $atts = [], $content = '' );
}

ここで 上記のリンク先の回答と同じ質問で、@ toschoがショートコードコールバックを置き換える方法を確認できます。

私はこれをテストしなかったことに注意してください、しかしうまくいけばあなたはこれをあなたのニーズに合わせて調整することができます。

4
birgire