Как изменить атрибуты шорткода с данными из текущей записи


Заранее приношу извинения за отсутствие у меня знаний PHP/WP и за то, что я многословно объясняю, что я ищу, но я уже пару дней пытаюсь найти решение, и я только начинаю разбираться в фильтрах и цикле.

Вот чего я хотел бы достичь:

Шорткод для плагина, который я использую, имеет тег атрибута "sched", который я хотел бы сделать по существу динамичным, измененным на текущий (пользовательский) пост (пользовательский) слизняк категории. Вот пример существующего шорткода, который хорошо работает с плагином Расписания и табло MSTW:

[mstw_schedule_table sched="v-football"]

Мой план состоял в том, чтобы установить значение атрибута "sched" в "спорт" (для всех сообщений) в качестве заполнителя, который будет заменен пользовательской категорией "спорт" для текущего сообщения. Я настроил все слизни категории "спорт" в соответствии со значениями "расписание", используемыми в плагине, чтобы убедиться, что таблица расписания, отображаемая в текущем сообщении, соответствует правильный.

Примечание: Ко всем этим пользовательским постам (настроенным как "команда") должна быть применена только одна категория "спорт": я настроил категории "спорт" в качестве раскрывающегося мета-окна в admin, например это.

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

Вот что я попробовал:

Это самое близкое, что я получил, но я знаю, что использую неправильный фильтр или другой вызов функции в неподходящее время. Обратите внимание, что я запустил этот код в "single-team.php "файл, который я создал для своего пользовательского типа записи, перед циклом. Я знаю, что это, вероятно, должно быть в functions.php или отдельный плагин (пожалуйста, посоветуйте).

Мое вдохновение:
do_shortcode_tagдо_шорткода_тег / получить_термы

    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
}

Я также подумал о запуске функции обработчика шорткода плагина (например, это) с измененным аргументом, но я не знаю, как получить доступ/изменить этот аргумент, прежде чем он будет интерпретирован плагином.

Я также видел этот пример, где шорткод генерируется в пользовательском шаблоне публикации...

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

Буду признателен за любую помощь. Спасибо.

Author: Peter Arthur, 2017-09-13

2 answers

Для всех, кто может наткнуться на это, я нашел решение:

В моем конкретном случае я использую файл шаблона с одним[таксономией].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;    
                }
           }

Этот код является немного менее сложный, чем тот, который я использовал (мне нужно было выбрать только таксономии видов спорта, не являющихся родителями), но эта упрощенная версия может помочь кому-то другому. Эти ссылки помогли мне на этом пути:

Получить имя пользовательской категории из идентификатора (Ответ)

Get_the_термы()

 1
Author: Peter Arthur, 2017-09-27 16:08:25

Да, вы можете фильтровать и изменять атрибуты шорткода любого стороннего плагина и изменять вывод шорткода в соответствии с обновленными шорткодами

Тематическое исследование
Например, у нас есть шорткод стороннего плагина usermeta и его обязательный атрибут идентификатор пользователя , и мы хотим изменить значение атрибута идентификатор пользователя.

Следующее решение протестировано и работает 100%.

// hook the custom callback function on the do_shortcode_tag action hook 
add_action( 'do_shortcode_tag', 'update_shortcode_attr_and_output', 1, 4 );


//callback function to filter and modify the usermeta shortcode attr & output
function update_shortcode_attr_and_output( $output, $tag, $attr, $m ) {

         //Filter the shortcode tag
        if (  'usermeta' == $tag && ! isset( $attr['user_id'] ) ) {

            // Update ShortCode Attribute user_id value
            $attr['user_id'] = $this->user_id;

            /**
             * update outup according updated attr
             * Refrence: https://core.trac.wordpress.org/browser/trunk/src/wp-includes/shortcodes.php?rev=38713#L342
             */
            global $shortcode_tags;
            $content = isset( $m[5] ) ? $m[5] : null;
            $output  = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];

        }

        return $output;
}
 1
Author: Ejaz UL Haq, 2020-12-31 21:40:36