Как изменить атрибуты шорткода с данными из текущей записи
Заранее приношу извинения за отсутствие у меня знаний 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?)
Буду признателен за любую помощь. Спасибо.
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;
}
}
Этот код является немного менее сложный, чем тот, который я использовал (мне нужно было выбрать только таксономии видов спорта, не являющихся родителями), но эта упрощенная версия может помочь кому-то другому. Эти ссылки помогли мне на этом пути:
Получить имя пользовательской категории из идентификатора (Ответ)
Да, вы можете фильтровать и изменять атрибуты шорткода любого стороннего плагина и изменять вывод шорткода в соответствии с обновленными шорткодами
Тематическое исследование
Например, у нас есть шорткод стороннего плагина 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;
}