Стиль по-другому отредактированные сообщения

Там какой-либо путь состоит в том, чтобы добавить класс к отредактированным сообщениям для моделирования их по-другому? Если бы существует способ сделать это, не добавляя класс, этот вариант был бы намного лучше.

ОТРЕДАКТИРОВАННЫЙ - ИГНОРИРУЮТ ВЫШЕУПОМЯНУТЫЙ ВОПРОС - ПОСМОТРИТЕ НИЖЕ

Существует ли способ добавить флажок (meta поле) в области, что пользователь пишет статью поэтому, когда это будет проверено, класс будет добавлен на определенном сообщении (в цикле и на единственной странице сообщения)? Если что-то вроде этого, путь невозможен, существует ли способ сделать это с пользовательским полем? Если бы оба возможны, я предпочел бы первый путь.

1
15.05.2012, 01:14
3 ответа

Это очень похоже на ответ @mrwweb, но изложено в деталях. Мы также не собираемся перегружать taxonomies, чтобы получить наш класс сообщения, но сделать то, что Вы хотели первоначально: используйте пользовательское meta поле.

В названном теге шаблона существует созданный post_class. Почти как любая функция в WordPress можно управлять его выводом через фильтр.

Шаг один: добавьте meta поле.

Это сделано через add_meta_box. Если Вы задаетесь вопросом, каковы аргументы, можно направиться на в кодекс - документы очень хороши. Вещью, которая будет касаться, является третий аргумент, который указывает функцию обратного вызова - обратный вызов - то, что представляет HTML. Для добавления meta поля, мы сцепимся в add_meta_boxes_post и звоните add_meta_box.

Вот целое соглашение:

<?php
add_action('add_meta_boxes_post', 'wpse52122_meta_box');
/*
 * Adds a meta box on the post editing screen.
 *
 * @uses add_meta_box
 */
function wpse52122_meta_box()
{
    add_meta_box(
        'wpse52122-box',
        __('Add Custom Style', 'wpse52122'),
        'wpse52122_meta_box_cb',
        'post',
        'side',
        'low'
    );
}


/*
 * Callback function for the meta box added above. This is what renders the 
 * boxes HTML.
 *
 * @uses get_post_meta
 */
function wpse52122_meta_box_cb($post)
{
    $meta = get_post_meta($post->ID, '_wpse52122_style', true);
    wp_nonce_field('wpse52122_nonce', 'wpse52122_nonce', false);
    echo '<p>';
    echo '<label for="wpse52122_style">' . __('Edited?', 'wpse52122') . '</label> ';
    echo '<input type="checkbox" name="wpse52122_style" id="wpse52122_style" ' .
         checked($meta, 'on', false) . ' />';
    echo '</p>';
}

Теперь мы должны на самом деле сохранить тот материал, когда сообщение сохраняется. Вы сцепляетесь в save_post сделать это:

<?php
add_action('save_post', 'wpse52122_save_post');
/*
 * Hooked in `save_post` this is the function that will take care of saving the
 * checkbox rendered above
 *
 * @uses update_post_meta
 * @uses wp_verify_nonce
 * @uses current_user_can
 */
function wpse52122_save_post($post_id)
{
    // no auto save
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
        return;

    // can the current user edit this post?
    if(!current_user_can('edit_post', $post_id))
        return;

    // Do we have our nonce?
    if(!isset($_POST['wpse52122_nonce']) ||
        !wp_verify_nonce($_POST['wpse52122_nonce'], 'wpse52122_nonce')) return;

    // if the the box is set, save meta key with 'on' as the value.
    $val = isset($_POST['wpse52122_style']) && $_POST['wpse52122_style'] ?
                'on' : 'off';
    update_post_meta($post_id, '_wpse52122_style', esc_attr($val));
}

Наконец, рычаг в post_class добавить Ваш 'отредактированный' класс. Ваша крючковатая функция получит три аргумента, мы обеспокоены первым и последним: массив классов сообщения и идентификатора сообщения соответственно.

<?php
add_filter('post_class', 'wpse52122_post_class', 10, 3);
/*
 * Hooked into `post_class` this function adds the class 'edited' to the
 * post_class array if the meta value `_wpse52122_style` is set to 'on'
 *
 * @uses get_post_meta
 * @return array The Post classes
 */
function wpse52122_post_class($classes, $class, $post_id)
{
    if('on' == get_post_meta($post_id, '_wpse52122_style', true))
    {
        $classes[] = 'edited';
    }
    return $classes;
}

Готово! Все, что походит на довольно мало работы, как бы то ни было. Итак, почему не просто сцепляются в post_class и сравните post_created_gmt и post_modified_gmt?

<?php
add_filter('post_class', 'wpse52122_post_class_alt', 11, 3);
/*
 * Filter the post_class and add the class edited if the post_date_gmt & 
 * post_modified_gmt don't match up.
 *
 * @uses get_post
 * @return array The post classes
 */
function wpse52122_post_class_alt($classes, $class, $post_id)
{
    $post = get_post($post_id);
    if(!$post) return $classes;
    $created = strtotime($post->post_date_gmt);
    $mod = strtotime($post->post_modified_gmt);
    if($mod > $created)
    {
        $classes[] = 'edited-alt';
    }
    return $classes;
}

Вот все это как плагин.

1
19.02.2020, 23:05
  • 1
    за Ваш ПОТРЯСАЮЩИЙ ответ. Я предпочитаю первый путь, потому что я хочу, чтобы у пользователя была опция сделать что-то как этот. Не было бы хорошо, если это происходит, когда кто-то исправляет просто опечатку. –  Arg Geo 16.05.2012, 00:26
  • 2
    О, после выполнения вообще Вы сказали мне, результату: поле Meta появляется, но класс не добавляется. Я сделал все точно, как Вы сказали. Кажется, сохраняет опции, когда сообщения обновляются, но никакой примененный класс. –  Arg Geo 16.05.2012, 01:03
  • 3
    Вы копировали и вставляли код? Или перепишите его? –  chrisguitarguy 16.05.2012, 01:05
  • 4
    О, я глуп! Забыл добавлять <? php post_class ();?> в цикле. Протестированный и хорошо работал!!! Существует ли способ добавить столбец в администраторской области сообщений, которая говорит "отредактированный"? Также действительно ли возможно установить дату истечения срока (пользователь определяет это), таким образом, класс "отредактированный" удаляется после желаемой даты? –  Arg Geo 16.05.2012, 01:12
  • 5
    Да существует! Необходимо поместить его в другой вопрос. Что-то как, "Как Истечь Метаклавиша Сообщения". Вот то, как Вы добавляете столбцы к таблице списка сообщения: justintadlock.com/archives/2011/06/27 / … –  chrisguitarguy 16.05.2012, 01:32

Пользовательское meta поле с полем флажка, вероятно, работало бы лучше всего, но самое легкое решение, о котором я могу думать, является этим:

  1. Создайте категорию "Edited".
  2. Удостоверьтесь, что Вы используете post_class() на элементе обертки каждой статьи/сообщения/страницы.*
  3. Добавьте правило CSS, которое ищет .category-edited класс на обертке сообщения (или .category-{идентификатор}, который более безопасен, если "отредактированный" краткий заголовок когда-нибудь изменяется).

post_class() функция (чтение об этом на Кодексе) является тегом шаблона, используемым в файлах темы. Это поставило переносящийся элемент для каждого сообщения в цикле. Это может быть на любом элементе HTML, но общие div, article (Только HTML5), и li. Используя класс похож на это:

<article <?php post_class(); ?>>
    <!-- stuff like the_title() and the_content() goes here. -->
</article>

Post_class() затем генерирует что-то как "класс ='post пост23 события категории".

0
19.02.2020, 23:05
  • 1
    мне нравится это решение mrwweb, но: 1) я ясно не понимаю № 2 2) В сообщениях, я отображаю категории, таким образом, я могу скрыть это так, он не будет отображен? –  Arg Geo 15.05.2012, 02:38
  • 2
    , который я понимаю, как сделать это теперь. Так, класс ".category-отредактированный" будет добавлен. Поскольку я сказал Вам, что отображаю категории сообщения в каждом сообщении. Как я могу скрыть категорию "Edited", которая появится, но сохранит категорию примененной? –  Arg Geo 15.05.2012, 02:48
  • 3
    Вы могли использовать тег, или Вы могли зарегистрировать пользовательскую таксономию и использовать этот отрывок для генерации класса сообщения. –  mrwweb 15.05.2012, 02:50
  • 4
    я не спрашивал о классе сообщения mrwweb. Например, позволяет, говорят, что мое сообщение имеет следующие категории: Политика - Спорт - Кино. После выполнения, что Вы сказали, категории теперь будут: Политика - Спорт - Кино - Отредактированный. Как я могу скрыть категорию под названием "Отредактированный", но все еще остаться приложенным к сообщению, таким образом, класс "отредактированный категорией" все еще применяется. –  Arg Geo 15.05.2012, 03:02
  • 5
    я просто хотел обновить ответ класса сообщения для общей ясности. Прямо сейчас я не могу думать об отличном способе скрыть отредактированную категорию, следовательно мой последний комментарий об использовании тегов или пользовательского taxonomies вместо этого. –  mrwweb 15.05.2012, 03:21

В основном то, что Вы хотите сделать, записать или функцию или маленький плагин (не настолько сложный, если Вы знаете php).

Чтобы сделать, чтобы Вы кодировали запущенный в нужное время, можно сцепиться в действие или фильтр, который произойдет, когда сообщение будет обновлено.

Если Вы не уверены, что это означает, необходимо читать на wordpress.org о том, как записать плагины и видеть Действие и Фильтр API. Основное различие между действиями и фильтрами - то, что фильтр позволяет Вам изменить некоторые данные. В Вашем случае, который интересен, потому что фильтр wp_insert_post_data предоставляет Вам доступ ко всему содержанию сообщения и метаданным, прежде чем это будет сохранено в базе данных.

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

Однако я сохранил бы это простым для первой версии и просто сделал бы сравнение в php и добавил бы правильный класс автоматически. Это значительно более просто реализовать и вероятно более желательный, чем необходимость в пользователе для выбора этого сознательно.

Так, технически это сводится к этому:

  1. Создайте рычаг на фильтре wp_insert_post_data.
  2. Уже сравните новое содержание с этим в базе данных
  3. Если изменено существенно, добавьте некоторый идентификатор к сообщению в базе данных
  4. В Вашей теме назовите post_class, чтобы проверить базу данных и добавить желаемый класс
  5. В Вашей CSS темы определите новый взгляд для этих отредактированных сообщений

Относительно 3, обратите внимание, что wp не сохраняет классы в базе данных, они сгенерированы во времени выполнения, когда страницы сгенерированы. Вы хотите сохранить некоторую длительную информацию связанной с сообщением, хотя, таким образом, необходимо добавить что-то. Я думаю, что у Вас есть выбор между пользовательским meta полем или существующим полем состояния. У последнего могли бы быть некоторые сложности в том смысле, что, если Вы изменяетесь, состояние статей от опубликованного до отредактированного говорит, Вам, возможно, придется проверить, каковы все последствия этого. Потенциально код Wordpress или плагины рассчитывают на сообщения, "опубликованные", чтобы сделать определенные вещи.

Теперь, я не знаю, каков Ваш php навык. Если Вам нужно больше сообщенного мне объяснения, и я могу разработать те пять точек в немного большем количестве деталей. Иначе codex.wordpress.org имеет все объяснение, в котором Вы нуждаетесь.

Ps: не забывайте, что программирование является 75%-й обработкой ошибок. Например, wp_insert_post_data будет также стрелять, когда новое сообщение будет создано и очевидно проверка, что база данных для предыдущей версии не даст Вам разумный результат для сравнения. Подобные вещи должны быть очевидными, но я думаю для большого количества людей, которые они не. В сущности думайте сценарии. Попытайтесь задумать весь возможный вход, который Ваш код мог получить и попытаться сознательно сделать лучшую вещь, Вы можете в каждой ситуации.

0
19.02.2020, 23:05
  • 1
    Мои php навыки не совершенствуются поэтому, если это - единственный путь, который может быть сделан, я не буду включать эту функцию в свою тему. Большое спасибо за Вас помогают. –  Arg Geo 15.05.2012, 02:22