Добавьте встроенный стиль на страницы, где использовался короткий код

Я пытаюсь добавить стиль в заголовок, используя этот метод, стиль загружается только на отдельные сообщения, но если я использую короткий код для загрузки содержимого сообщения, которое стиль не загружается в заголовке:

add_action( 'wp_head', 'output_styles') function output_styles($base_ID){ $global post; echo '<style type="text/css">'. get_post_meta($post->ID, 'append_css') .'</style>'; } 

в моем коротком кодеде я передаю идентификатор сообщения, если я ouput_styles функции ouput_styles из функции ouput_styles :

 output_styles($pass_id); 

затем output_style содержимое output_style но оно не находится в заголовке. Это прямо перед выходом короткого кода.

Как я могу выводить стиль в заголовке при использовании коротких кодов?

В этом случае has_shortcode () является вашим другом.

Сначала мы подключаемся к wp_print_styles вместо wp_head . В func мы зацепляем, проверяем, содержит ли сообщение наш короткий код. Если это так, мы получаем требуемый CSS и выводим его как встроенный <style> .

 add_action ('wp_print_styles', 'wpse_enqueue_shortcode_css') ; function wpse_enqueue_shortcode_css () { global $post ; if (is_single () && has_shortcode ($post->post_content, 'my_shortcode')) { $append_css = get_post_meta ($post->ID, 'append_css', true) ; echo <<<EOF <style type='text/css'> $append_css </style> EOF; } return ; } 

@bosco, спасибо за комментарий … Я неправильно понял, что пытался сделать @Alen ( global $post в коде, включенном в вопрос, меня отбросила).

Если мое понимание теперь правильно, следующее должно сделать трюк (altho, это немного уродливо). Он работает, подключаясь к wp_print_styles внутри функции, которая обрабатывает wp_print_styles .

 add_shortcode ('my_shortcode', 'my_shortcode') ; function my_shortcode ($atts) { $defaults = array ( 'id' => '', // other atts for the shortcode ) ; $atts = shortcode_atts ($defaults, $atts) ; if (!empty ($atts['id'])) { global $my_shortcode_css ; // grab the CSS from the post whose ID was passed in the 'id' attribute of // my_shortcode, eg, [my_shortcode id='123'] // and store it in a global $my_shortcode_css = get_post_meta ($atts['id'], 'append_css', true) ; // no need to hook into wp_print_styles IF we don't have any CSS to output if (!empty ($my_shortcode_css)) { // hook into wp_print_styles with an anonymous func add_action ('wp_print_styles', function () { global $my_shortcode_css ; if (empty ($my_shortcode_css)) { return ; } echo <<<EOF <style type='text/css'> $my_shortcode_css </style> EOF; // clean up, since we no longer need this global unset ($my_shortcode_css) ; }) ; } } // insert code to produce the output of the shortcode $output = ... ; return ($output) ; } 

Примечание. Если вы можете представить, что [my_shortcode] используется более одного раза в заданном сообщении, вероятно, было бы неплохо добавить логику к вышеуказанному, чтобы проверить, был ли CSS уже выведен для заданного идентификатора сообщения. Я оставлю это как «упражнение для читателя» 🙂