За последние 24 часа нас посетили 22740 программистов и 1200 роботов. Сейчас ищут 678 программистов ...

Создание шорткода с выводом кнопки через <<< EOT ломает разметку

Тема в разделе "Wordpress", создана пользователем jurvrn.ru, 19 июл 2019.

  1. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    Такой код ломает разметку, как правильно тут создать шорткод?
    как впрочем и return '

    Код (Text):
    1. <?php
    2.  
    3. add_shortcode ( 'thanks', 'my_shortcode_thanks' );
    4.  
    5. function my_shortcode_thanks ( $attr, $content = null ) {
    6.  
    7. return <<< EOT
    8. <html>
    9.     <head>
    10.         <style>
    11.              .accordion {
    12.                 background-color: #eee;
    13.                 color: #444;
    14.                 cursor: pointer;
    15.                 padding: 18px;
    16.                 width: 50%;
    17.                 border: none;
    18.                 text-align: center;
    19.                 outline: none;
    20.                 font-size: 15px;
    21.                 transition: 0.4s;
    22.             }
    23.          
    24.             .active, .accordion:hover {
    25.                 background-color: #ccc;
    26.             }
    27.          
    28.             .panel {
    29.                 padding: 0 18px;
    30.                 display: none;
    31.                 background-color: white;
    32.                 overflow: hidden;
    33.             }
    34.         </style>
    35.     </head>
    36.  
    37.  
    38. <body>
    39.  
    40.     <button class="accordion">Сайт юристы Воронежа благодарит...</button>
    41.      
    42.         <div class="panel">
    43.           <p>Lorem ipsum dolor sit amet, consectetur a............. nostrud exercitati uip ex ea commodo consequat.</p>
    44.         </div>
    45.  
    46.     <script>
    47.         var acc = document.getElementsByClassName("accordion");
    48.         var i;
    49.  
    50.         for (i = 0; i < acc.length; i++) {
    51.             acc[i].addEventListener("click", function() {
    52.                 this.classList.toggle("active");
    53.                 var panel = this.nextElementSibling;
    54.                 if (panel.style.display === "block") {
    55.                     panel.style.display = "none";
    56.                 } else {
    57.                     panel.style.display = "block";
    58.                 }
    59.             });
    60.         }
    61.     </script>
    62.  
    63. </body>
    64. </html>
    65. EOT;
    66. }
    67. ?>
    и более простой вариант ведет себя также
    Код (Text):
    1. <?php
    2. function my_shortcode_thanks () {
    3.  
    4.  
    5. return '
    6. <style type="text/css">
    7.              .accordion {
    8.                 background-color: #eee;
    9.                 color: #444;
    10.                 cursor: pointer;
    11.                 padding: 18px;
    12.                 width: 50%;
    13.                 border: none;
    14.                 text-align: center;
    15.                 outline: none;
    16.                 font-size: 15px;
    17.                 transition: 0.4s;
    18.             }
    19.            
    20.             .active, .accordion:hover {
    21.                 background-color: #ccc;
    22.             }
    23.            
    24.             .panel {
    25.                 padding: 0 18px;
    26.                 display: none;
    27.                 background-color: white;
    28.                 overflow: hidden;
    29.             }
    30.         </style>
    31.    
    32.     <button class="accordion">Сайт юристы Воронежа благодарит...</button>
    33.        
    34.         <div class="panel">
    35.           <p>Lorem ipsum dolor sit amet, consectetur a............. nostrud exercitati uip ex ea commodo consequat.</p>
    36.         </div>
    37.    
    38.     <script>
    39.         var acc = document.getElementsByClassName("accordion");
    40.         var i;
    41.  
    42.         for (i = 0; i < acc.length; i++) {
    43.             acc[i].addEventListener("click", function() {
    44.                 this.classList.toggle("active");
    45.                 var panel = this.nextElementSibling;
    46.                 if (panel.style.display === "block") {
    47.                     panel.style.display = "none";
    48.                 } else {
    49.                     panel.style.display = "block";
    50.                 }
    51.             });
    52.         }
    53.     </script>';
    54. }
    55.  
    56. add_shortcode ( 'thanks', 'my_shortcode_thanks' );
    57.  
    58. ?>
     
    #1 jurvrn.ru, 19 июл 2019
    Последнее редактирование: 19 июл 2019
  2. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    и даже такой вроде правильный код не работает
    Код (Text):
    1. <?php
    2. function my_shortcode_thanks ($atts , $content = null ) {
    3.     ob_start();
    4.    
    5. ?>
    6.    
    7. <div style="border: 2px dotted green">
    8.  
    9. <button class="accordion">Сайт юристы Воронежа благодарит...</button>
    10.        
    11.         <div class="panel">
    12.           <p>Lorem ipsum dolor sit amet, consectetur a............. nostrud exercitati uip ex ea commodo consequat.</p>
    13.         </div>
    14.        
    15. <style type="text/css">
    16.  
    17.              .accordion {
    18.                 background-color: #eee;
    19.                 color: #444;
    20.                 cursor: pointer;
    21.                 padding: 18px;
    22.                 width: 50%;
    23.                 border: none;
    24.                 text-align: center;
    25.                 outline: none;
    26.                 font-size: 15px;
    27.                 transition: 0.4s;
    28.             }
    29.            
    30.             .active, .accordion:hover {
    31.                 background-color: #ccc;
    32.             }
    33.            
    34.             .panel {
    35.                 padding: 0 18px;
    36.                 display: none;
    37.                 background-color: white;
    38.                 overflow: hidden;
    39.             }
    40.         </style>
    41.    
    42.  
    43.     <script>
    44.         var acc = document.getElementsByClassName("accordion");
    45.         var i;
    46.  
    47.         for (i = 0; i < acc.length; i++) {
    48.             acc[i].addEventListener("click", function() {
    49.                 this.classList.toggle("active");
    50.                 var panel = this.nextElementSibling;
    51.                 if (panel.style.display === "block") {
    52.                     panel.style.display = "none";
    53.                 } else {
    54.                     panel.style.display = "block";
    55.                 }
    56.             });
    57.         }
    58.     </script>
    59. </div>
    60.  
    61.  
    62. <?php
    63.  
    64. $html = ob_end_clean();
    65.  
    66. return $html;
    67.  
    68. }
    69.  
    70. add_shortcode ( 'thanks', 'my_shortcode_thanks' );
    71.  
    72. ?>
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Ну пихать в шорткод всё, от <html> точно неправильно. Другие варианты должны, по идее, срабатывать. Код вставляется в то место, где шорткод вы пишите? Тему переношу в WordPress
     
    jurvrn.ru нравится это.
  4. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @mkramer, сам шоркод, а выводится в футере через
    <?php echo do_shortcode ('[thanks]'); ?>

    аналогичный код работает правильно если создаешь на его основе виджет.
    видимо мой код как дополнительно "экранировать" нужно в потоке элементов. Хотя EOT для этого и нужен...
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Выводится ли в этом месте код html? Ничего экранировать не нужно, насколько я помню. Как ты определяешь, что у тебя что-то сломалось? Визуально или по исходному коду страницы?
     
  6. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @mkramer, визуально - странно увеличивается область чата, которая выводится через шорткод текстового виджета (которая в хидере).
    Если отключить мой новый шорткод - всё нормально становится, посмотрите сами на jurvrn.ru
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Визуально - это непрофессионально на 100%. Для начала надо нажать волшебные кнопочки Ctrl+U в браузере, и посмотреть, выводится ли код шорткода. Если выводится, то проблема в каких-нибудь стилях
     
  8. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @mkramer, сайт это черновик. Только вырабатываю структуру. По поводу стилей...скорее всего где-то они совмещаются в потоке html... иначе как они могут влиять на друг друга? Тем более странно что этот последний виджет так влияет на другой.... Буду начинать сначала. Как правильно программировать такой шорткод? Есть образец, основа. Не хочу плагинами пользоваться
     
  9. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @mkramer я разобрался, с кодом было всё правильно!
    вы были правы, спасибо, дело в стиле - там в одном шорткоде был стиль .active, который вешал на скрипт действие, видимо в двух шорткодах они как-то пересекались, я просто сделал .accordion.active, то есть индивидуализировал стиль, чтобы не пересекались
     
  10. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    PS не помогло. Свойства стилей active почему то накладываются на две кнопки в разных местах....Видимо это косяки java
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Где ты там её впендюрил в WordPress? Или речь про JavaScript?
     
  12. jurvrn.ru

    jurvrn.ru Новичок

    С нами с:
    14 июн 2019
    Сообщения:
    97
    Симпатии:
    2
    @mkramer я про <script> имел ввиду... это наверно jquery (см. первый пост)
    в итоге выяснилась причина - ваша правда - стили сбивались, по причине того, что были в коде php лишние пробелы и кодировка файла с BOM ))
    тему закрыть можно