Проблема с шорткодом WP_Editor

Вопрос или проблема

Я создал редактор на стороне клиента, используя wp_editor, который работает так, как должен.

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

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

if(!is_feed() && current_user_can( 'manage_network' ) ) :

function ps_add_post_editor($content) {
global $post;
$settings = array(
    'wpautop' => true,
    'media_buttons' => false
);
    $content .= '<div id="content-edit-area" style="display:none;"><form action="" id="page-content-editor-panel" method="post"><span id="ajax_my_post_edit_nonce" class="hidden">' . wp_create_nonce( 'ajax_my_post_edit_nonce' ) . '</span>' . ps_get_wp_editor($post->post_content, 'textarea-' . $post->ID , $settings) . '<input type="submit" id="feesavebtn" value="Save" /></form><a href="#" id="cancelbtn">Cancel</a></div><br><br><div id="loadingmessage"><img src="'.get_template_directory_uri().'/images/loading.gif" /> saving...</div>

    <style type="text/css">
        #textarea-'.$post->ID.'_ifr, #textarea-'.$post->ID.' { min-height:700px !important; }
    </style>

    <script type="text/javascript">
    jQuery(\'#page-content-editor-panel\').submit(function(){       
    var pageid = '.$post->ID.'; 
    var content;
    var editor = tinyMCE.get(\'textarea-'.$post->ID.'\');
    if (editor) {
        content = editor.getContent();
    } else {
        content = jQuery(\'#textarea-'.$post->ID.'\').val();
    }       
    jQuery(\'#content-edit-area\').hide();  
    jQuery(\'#loadingmessage\').show(); 
    jQuery.post(
       ajaxurl, 
       {
          \'action\':\'add_foobar\',
          \'nonce\':jQuery(\'#ajax_my_post_edit_nonce\').text(),
          \'post_id\':pageid,
          \'post_data\':content
       }, 
       function(response){            
          window.location.reload(true); 
       }
    ); 
    return false;        
    });
    </script>';

return $content;
}

function ps_get_wp_editor($content,$textarea,$settings) {
ob_start();
wp_editor($content, $textarea, $settings);
$edior_html_code = ob_get_contents();
ob_end_clean();
return $edior_html_code;
} 
add_filter('the_content', 'ps_add_post_editor');

add_action('wp_ajax_add_foobar', 'prefix_ajax_add_foobar');
add_action('wp_ajax_nopriv_add_foobar', 'prefix_ajax_add_foobar');

function prefix_ajax_add_foobar() {
if( wp_verify_nonce( $_REQUEST['nonce'], 'ajax_my_post_edit_nonce' ) )           {      
    $myfee_post = array();
    $myfee_post['ID'] = $_POST['post_id'];
    $myfee_post['post_content'] = $_POST['post_data'];
    wp_update_post( $myfee_post );      
    die("Эта страница была обновлена."); 
} else {        
    die("Не удалось обработать ваш запрос в данный момент.");
}
}

endif;

Вы можете отображать шорткоды в редакторе WP, удалив фильтр do_shortcode из фильтра the_content, как показано в следующем коде, но остерегайтесь, что это также будет отображать теги шорткодов, когда вы используете функцию the_content() в теме в любом другом месте, поэтому перед функцией the_content() снова добавьте фильтр do_shortcode таким образом: add_filter(‘the_content’, ‘do_shortcode’,15 );

function ps_get_wp_editor($content,$textarea,$settings) {
    remove_filter('the_content', 'do_shortcode',11 );
    ob_start();
    wp_editor($content, $textarea, $settings);
    $edior_html_code = ob_get_contents();
    ob_end_clean();
    return $edior_html_code;
} 

.

Ответ или решение

Проблема со шорткодами в WP_Editor: Рекомендации по решению

Приветствую вас, уважаемые коллеги. В этом ответе я постараюсь подробно разобраться с проблемой отображения шорткодов в WP_Editor, используя представленный вами код. Давайте рассмотрим, как решить эту проблему, сохранив все функции редактора.

Анализ проблемы

Вы создали front-end редактор на базе функции wp_editor, который корректно выполняет свои задачи. Однако возникла проблема — при вставке шорткодов, они не отображаются должным образом, поскольку выходные данные обрабатываются при помощи функции output buffering (ob_). Когда вы убираете эту функцию, шорткоды начинают отображаться правильно, но функционал редактора при этом ломается.

Решение проблемы

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

Вот как это можно сделать:

function ps_get_wp_editor($content, $textarea, $settings) {
    // Убираем фильтр do_shortcode, чтобы шорткоды не обрабатывались
    remove_filter('the_content', 'do_shortcode', 11);

    ob_start();
    wp_editor($content, $textarea, $settings);
    $editor_html_code = ob_get_contents();
    ob_end_clean();

    // Восстанавливаем фильтр do_shortcode
    add_filter('the_content', 'do_shortcode', 15);

    return $editor_html_code;
}

Объяснение изменений

  1. Удаление фильтра: При вызове remove_filter('the_content', 'do_shortcode', 11); мы отключаем фильтр, который отвечает за обработку шорткодов. Это позволяет вашему редактору видеть оригинальный текст вместе с шорткодами.

  2. Вывод редактора: Всё еще используется функция ob_start() и ob_get_contents(), чтобы захватить вывод и вернуть его без потери формата HTML.

  3. Восстановление фильтра: Обратите внимание, что восстановление происходит сразу после получения HTML кода редактора. Это значит, что в контексте других вызовов the_content() в вашей теме шорткоды будут снова обрабатываться.

Важные замечания

  • Проверьте, не будет ли конфликтов при использовании данного подхода в других местах вашего кода.
  • Убедитесь, что ваш метод обработки AJAX также корректно обрабатывает данные, чтобы избежать потенциальных удержаний шорткодов на этапе сохранения контента.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...