Добавление nl2br в мой пользовательский метабокс Wordpress

Хорошо, позвольте мне посмотреть, смогу ли я объяснить это правильно. В wordpress у нас есть поле для вставки отрывка. Нам нужно добавить второе поле выдержки. Вместо того, чтобы вручную добавлять настраиваемое поле к каждому сообщению, я разместил функцию для автоматического добавления настраиваемого поля в виде мета-поля на странице сообщения администратора.

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

Вот мой код:

function my_create_post_meta_box() {
    add_meta_box( 'my-meta-box', 'Second Excerpt', 'my_post_meta_box', 'post', 'normal', 'high' );
}

function my_post_meta_box( $object, $box ) { ?>
<p>
    <label for="second-excerpt">
        <strong>Second Excerpt With Images for Post List Page</strong>
    </label>
    <textarea name="second-excerpt" id="second-excerpt" cols="60" rows="4" tabindex="30" style="width: 97%;" wrap="hard"><?php echo wp_specialchars( get_post_meta( $object->ID, 'Second Excerpt', true ), 1 ); ?></textarea>
    <input type="hidden" name="my_meta_box_nonce" value="<?php echo wp_create_nonce( plugin_basename( __FILE__ ) ); ?>" />
</p>
<?php
}

function my_save_post_meta_box( $post_id, $post ) {

    if ( !wp_verify_nonce( $_POST['my_meta_box_nonce'], plugin_basename( __FILE__ ) ) )
        return $post_id;

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

    $meta_value = get_post_meta( $post_id, 'Second Excerpt', true );
    $new_meta_value = stripslashes( $_POST['second-excerpt'] );

    if ( $new_meta_value && '' == $meta_value )
        add_post_meta( $post_id, 'Second Excerpt', $new_meta_value, true );

    elseif ( $new_meta_value != $meta_value )
        update_post_meta( $post_id, 'Second Excerpt', $new_meta_value );

    elseif ( '' == $new_meta_value && $meta_value )
        delete_post_meta( $post_id, 'Second Excerpt', $meta_value );
}

Спасибо и любая помощь будет делать.


person TikaL13    schedule 05.01.2010    source источник
comment
Каков ваш точный вопрос? Как использовать nl2br() или где его добавить в свой код?   -  person Jimmy Shelter    schedule 05.01.2010
comment
Мой вопрос заключается в том, где в моем коде я добавляю это, чтобы WordPress распознавал разрывы строк. извините, если это сбивает с толку   -  person TikaL13    schedule 05.01.2010


Ответы (4)


Используйте функцию wpautop в шаблоне внешнего интерфейса. Нравиться:

<?php $yourvalue =  get_post_meta($post->ID, "yourvalue", true);   
  if ($yourvalue != ""){ ?>
   <dt>Consult&oacute;rio:</dt>
   <dd><?php echo wpautop( $consultorio, $br = 1 ); ?></dd>
<?php } ?>
person Fábio ZC    schedule 01.11.2010
comment
Я попробую это в следующем проекте... спасибо за ответ. - person TikaL13; 02.11.2010

Просто добавьте эту строку после $new_meta_value = ...:

$new_meta_value = nl2br($new_meta_value);

И вместо того, чтобы сравнивать ваши значения с '', лучше использовать empty(). Также некоторые сравнения не нужны. Таким образом, часть добавления/обновления/удаления вашей функции сохранения может быть написана следующим образом:

if(empty($meta_value)) {
    add_post_meta( $post_id, 'Second Excerpt', $new_meta_value, true );
} elseif(empty($new_meta_value)) {
    delete_post_meta( $post_id, 'Second Excerpt', $meta_value );
} else {
    update_post_meta( $post_id, 'Second Excerpt', $new_meta_value );
}

Обратите внимание, что всегда рекомендуется использовать фигурные скобки, даже если ваша инструкция состоит всего из одной строки. Это улучшает читаемость и не испортит ситуацию, если/когда вам нужно добавить еще одну строку в предложение if.

person Tatu Ulmanen    schedule 05.01.2010
comment
Спасибо! Я сходил с ума... и это было так просто. - person TikaL13; 05.01.2010
comment
И последний вопрос. Когда я обновляю свои сообщения более одного раза, например, если было внесено редактирование, он продолжает добавлять линии ко второй выдержке. Могу ли я применить его только к посту только один раз? - person TikaL13; 05.01.2010
comment
Используйте str_replace('<br />', "\n", wp_specialchars( get_post_meta( $object->ID, 'Second Excerpt', true ), 1 )), чтобы вернуть теги разрыва строки к разрыву строки при вставке отрывка в текстовое поле. Теперь это звучит так, как будто теги разрыва строки вставлены в отрывок, и это как-то портит его при сохранении. - person Tatu Ulmanen; 05.01.2010
comment
Ну, это не совсем беспорядок. например: Это образец текста ‹br› - это правильно. Если я вернусь к своему сообщению и, скажем, добавлю что-нибудь к содержимому и снова сохраню, я получу: это образец текста ‹br›‹br› - я просто хочу ограничить добавление ‹br› только один раз. - person TikaL13; 05.01.2010
comment
Вы добавляете разрыв строки после ‹br›, это единственная причина, по которой он добавляет новые теги ‹br›. Не видя страницы, трудно сказать, почему так происходит. - person Tatu Ulmanen; 05.01.2010
comment
Это также дает мне перерыв для каждой строки, мне нужен только ‹br› в конце абзаца. - person TikaL13; 05.01.2010
comment
Тату... спасибо за вашу помощь. Вот страница для просмотра: blog.standforisrael.org Это то, что происходит на стороне администратора, когда сообщение обновлено: На прошлой неделе мы рассказали вам, как Мохаммад Мансур Азимзаде‹br /› Ардебили случайно включил национальную футбольную ассоциацию Израиля‹br /› в список рассылки по электронной почте, который рассылал новогодние ассоциации в‹br /› в международном футболе‹ br /› федерация. (Ардебили должен был отправить его всем ‹br /› командам Израиля.) - person TikaL13; 05.01.2010

Не изменяйте данные, сохраненные в базе данных. Сохраняйте именно то, что вводит пользователь. Вместо этого измените содержимое, когда вам нужно его отобразить. Таким образом, когда пользователь возвращается, чтобы отредактировать поле, редактируйте то, что он вставил, а не то, что вы сделали с его контентом.

Используйте wpautop, чтобы сделать тот же перевод текста, который WordPress применяет к необработанному контенту, введенному в поле пост-контента, и делайте это, когда контент запрашивается для отображения.

person Gipetto    schedule 09.01.2010
comment
Я не уверен, что понял тебя, Джипетто? Это решение на самом деле отлично работает для того, что нам нужно, но если вы считаете, что есть лучший способ, пожалуйста, не могли бы вы быть немного более описательным. Спасибо! - person TikaL13; 11.01.2010
comment
Вы сохраняете измененные данные в базу данных. Просто сохраните необработанные данные как введенные пользователем. Таким образом, когда пользователь возвращается, чтобы отредактировать текст, ему не нужно бороться с элементами ‹br /› в своем содержании. Поскольку ‹br /› необходим только для правильного вывода внешнего интерфейса, я бы применил функцию nl2br только при выводе контента на внешний интерфейс. Это не абсолют, но это практика, к которой я привык. В долгосрочной перспективе пользователю кажется проще сделать его готовым к отображению только тогда, когда вам нужно его отобразить. - person Gipetto; 12.01.2010
comment
Кроме того, используя функцию wpautop, встроенную в wordpress, вы получите лучший результат, чем nl2br. - person Gipetto; 12.01.2010

Хорошо, я нашел другое решение моей проблемы. Спасибо, Тату, за то, что заставили мой мозг работать. Для тех, кто ищет решение, вот что я сделал:

$new_meta_value = "<p>" . implode( "</p>\n\n<p>", preg_split( '/\n(?:\s*\n)+/', $new_meta_value ) ) . "</p>";
person TikaL13    schedule 05.01.2010