Расширение атрибутов Shortcode

Я искал много мест и много пытался для этого, но не успел.

У меня есть короткий код в моей WP Theme like;

[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 нельзя использовать с пользовательскими типами сообщений, потому что кодеры не помещали атрибут post_type в shortcode $ args (поэтому из-за значения по умолчанию это «сообщения», shortcode только извлекает стандартные сообщения).

В результате я хотел бы расширить / определить новую расширенную версию этого короткого кода для добавления атрибута post_type в качестве переменной (потому что я хотел бы использовать его для многих пользовательских типов сообщений). Как я могу это сделать? Благодарю.

Solutions Collecting From Web of "Расширение атрибутов Shortcode"

Не видя своего кода, сложно дать вам точный ответ. Существует фильтр shortcode_atts_{$shortcode} который был введен в WordPress 3.6. Все атрибуты запускаются через этот фильтр. Следует отметить, что параметр $shortcode должен быть установлен в shortcode_atts . Я еще не видел коротких кодов, у которых этот параметр установлен.

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

ИМО, у вас есть два выбора здесь

  • Обратитесь к автору темы и попросите его в соответствующем коде на короткий номер в его следующем обновлении. Я не думаю, что у него / нее будет проблема, так как это добавит значение для короткого кода

  • Создайте дочернюю тему и скопируйте короткий код в дочернюю тему. Измените короткий код при необходимости и не забудьте соответственно изменить имя функции и имя короткого кода. Таким образом, у вас будет короткий код, который соответствует вашим потребностям

Вот только дополнение к ответу @PieterGoosen.

Существует несколько способов, как можно изменить тип сообщения WP_Query , который находится внутри WP_Query . Предположим, что это [recent_posts] .

Метод A) Если в коротком коде используется третий параметр shortcode_atts() (как указано в @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 заменяет обратный вызов короткого кода в том же вопросе, что и мой связанный ответ выше.

Обратите внимание, что я не тестировал это, но, надеюсь, вы можете настроить это на свои нужды.