@Shimpanze

Почему при вызове хука 'save_post' не срабатывает DomDocument?

Как при вызове хука 'save_post' получить содержимое div'а на странице создания/редактирования поста в Админ-панели?

Всё ведь правильно написано во второй функции сохранения:

$my_dom = new DOMDocument;
$my_html = mb_convert_encoding( $my_html, 'HTML-ENTITIES', 'UTF-8' );
@$my_dom->loadHTML( $my_html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );
$my_value = $my_dom->getElementById( 'my_div' )->nodeValue;


...почему переменная $my_value возвращает NULL?

add_action( 'add_meta_boxes', function() {
  add_meta_box(
    'my-div-container',
    'My div',
    function( $post ) {
      wp_nonce_field( basename( __FILE__ ), 'my_div_nonce' );
      $my_html = '<div id="my_div" contenteditable="true">' . get_post_meta( $post->ID, 'my_div', true ) . '</div>';
      echo $my_html;
    },
    'post',
    'normal',
    'high'
  );
});

add_action( 'save_post', function( $post_id ) {
  if ( !isset( $_POST['my_div_nonce'] ) || !wp_verify_nonce( $_POST['my_div_nonce'], basename( __FILE__ ) ) )
    return $post_id;

  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
    return $post_id;

  if ( !current_user_can( 'edit_post', $post_id ) )
    return $post_id;

  $post = get_post( $post_id );
  if ( $post->post_type == 'post' ) {

    $my_dom = new DOMDocument;
    $my_html = mb_convert_encoding( $my_html, 'HTML-ENTITIES', 'UTF-8' );
    @$my_dom->loadHTML( $my_html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );
    $my_value = $my_dom->getElementById( 'my_div' )->nodeValue;

    update_post_meta(
      $post_id,
      'my_div',
      $my_value
    );

  }

  return $post_id;
});
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
Immortal_pony
@Immortal_pony Куратор тега PHP
В анонимной функции, которою вы вешаете на 'save_post' переменная $my_html не задана. Не совсем понятно, каких данных вы там ожидаете.

Отмечу, что на мой взгляд вы подошли к решению вопросу в корне неверно.
Во-первых, если вам нужен WYSIWYG-редактор в metabox, то для этого есть wp_editor (инструкция - https://stackoverflow.com/a/20276424/4287929)
Во-вторых, если уж решили полоьзоваться div contenteditable, то повесьте js на изменения контента, сохраняйте данные в input type="hidden" и спокойно ловите его вместо попыток парсинга непонятно чего.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы