web-dev-qa-db-ja.com

現在の投稿のデータでショートコードの属性を変更する方法

私はPHP/WPの知識の欠如、そして私が探しているものを説明することへの私の言葉遣いを前もって謝罪します、しかし私は数日の間解決策を考え出そうとしています私の頭をフィルターとループで包みます。

これが私が達成したいことです:

私が使用しているプラ​​グインのショートコードは、私が本質的に動的にしたい属性タグ "sched"を持っていて、現在の(カスタム)投稿の(カスタム)カテゴリスラッグに変更されました。これがMSTWスケジュールとスコアボードプラグインとうまく動作する既存のショートコードの例です:

[mstw_schedule_table sched="v-football"]

私の計画は、現在の投稿の「スポーツ」カスタムカテゴリスラッグに置き換えられるプレースホルダーとして、「sched」属性の値を「すべての投稿で」「sport」に設定することでした。現在の投稿に表示されるスケジュール表が正しいことを確認するために、すべての「スポーツ」カテゴリスラッグをプラグインで使用される「予定」値に対応するように設定しました。

注:これらすべてのカスタム投稿(「チーム」として設定)には、「スポーツ」カテゴリを1つだけ適用する必要があります。 this のように、adminのドロップダウンメタボックスとして「スポーツ」カテゴリを設定しました。

また、注:編集可能なショートコードをカスタム投稿のコンテンツ内で使用できるようにしたいので、投稿ごとに必要に応じて他の属性を編集できます。

これが私が試したものです:

これは私が得た最も近いですが、私は私が間違ったフィルタを使っているか、そうでなければ間違った時に関数を呼び出していることを知っています。このコードは、私のカスタム投稿タイプ用に作成した "single-team.php"ファイルで、ループの前に実行したことに注意してください。私はそれがおそらくfunctions.phpか別のプラグインにあるべきであることを知っています(アドバイスしてください)。

私のインスピレーション:
do_shortcode_tag / get_the_terms

    add_filter( 'do_shortcode_tag', 'wpse_106269_do_shortcode_tag', 10, 4);
    function wpse_106269_do_shortcode_tag( $output, $tag, $attr, $m ) {

        if( $tag === 'mstw_schedule_table' ) {
            //* Do something useful
            if ($attr['sched'] === 'sport-slug') {
                print_r($attr);

                // Get a list of tags and extract their names
                $sport = get_the_terms( get_the_ID(), 'sport' );
                if ( ! empty( $sport ) && ! is_wp_error( $sport ) ) {
                    $sport_slug = wp_list_pluck( $sport, 'slug' );

                    $attr['sched'] = $sport_slug[0];
                }

                echo "<br>";
                print_r($attr);
            }

        }
        return $output;
    }

これは出力します:

Array ( [sched] => sport-slug ) 
Array ( [sched] => v-football )

そのため、ショートコードの$ attrの値を変更できることはわかっていますが、プラグインによって解析される前に、元のショートコードを変更されたものに置き換える方法がわかりません。

the_content :を使ってみました

// Modify Content of a Post
add_filter('the_content', 'se24265_my_function');
function se24265_my_function( $content )
{
    $write = 'hello world'; 
    $new_content = $write . $content;

        $sport = get_the_terms( get_the_ID(), 'sport' );
        if ( ! empty( $sport ) && ! is_wp_error( $sport ) ) {
            $sport_slug = wp_list_pluck( $sport, 'slug' );

            str_replace("sport-slug", $sport_slug[0], $new_content);
        }
        return $new_content; 
        // outputs hello world
        // outputs inital shortcode without modifications
}

私はプラグインのショートコードハンドラ関数( this のような)を修正された引数で実行することも考えましたが、プラグインによって解釈される前にその引数にアクセス/修正する方法を知りません。

私はまた見ました これ /ショートコードがカスタム投稿テンプレート内で生成される例...

// Making your custom string parses shortcode
$string = do_shortcode( $string );
// If your string has a custom filter, add its tag name in an applicable add_filter function
add_filter( 'my_string_filter_hook_tag_name', 'do_shortcode' );

...しかし、必要に応じて各カスタム投稿内の異なる場所にショートコードを編集/配置する機能を維持したいのですが、それでも使用するフィルタフックがわかりません(content_edit_pre?)。

任意の助けがいただければ幸いです。ありがとう。

1
Peter Arthur

これに遭遇するかもしれない人のために、私は解決策を見つけました:

私の特定のケースでは、私は単一の[分類法] .phpテンプレートファイルを使用しており、投稿コンテンツ内のショートコードを修正する代わりにWordPress関数 do_shortcode() を使用してショートコードを手動で追加できました。

これが私が書いた方法です:

<?php echo do_shortcode( '[mstw_schedule_table sched="'.$sports_slug.'" ]' ); ?>

そして、これが私が$ sports_slugを私のために使えるようにした方法です。以前はファイル内(ループの外側):

// Get this post's sport taxonomy - https://wordpress.stackexchange.com/a/168862/127459
           $sports = get_the_terms($post->ID, 'sport');
           $sports_slug = '';
           if ($sports) { 

                foreach ($sports as $sport) {   
                    $sports_slug = $sport->slug;    
                }
           }

このコードは私が使ったものよりもやや複雑ではありません(私は親ではないスポーツ分類法のみを選択する必要がありました)が、この単純化されたバージョンは他の誰かに役立つかもしれません。これらのリンクは私を途中で助けてくれました:

IDからカスタムカテゴリ名を取得する(回答)

get_the_terms()

1
Peter Arthur