wp_text_diff()WP 2.6.0

Получает удобную для чтения HTML-таблицу с различиями между двумя переданными строками (текстами). Используется для сравнения изменений в ревизиях записи.

Если между строками нет различий, то wp_text_diff() вернет пустую строку. Возвращаемая таблица состоит из двух колонок: слева первый текст, справа второй. Удаленные и вставленные данные помечены тегами <del> и <ins>.

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

Pluggable функция — эту функцию можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.

Замена функции (переопределение) — в must-use или обычном плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

Работает на основе: Text_Diff(), WP_Text_Diff_Renderer_Table()

Хуков нет.

Возвращает

Строку. Cтроку: HTML код таблицы, если в строках есть разница. Если разницы нет, вернет пустую строку.

Использование

wp_text_diff( $left_string, $right_string, $args );
$left_string(cтрока) (обязательный)
"Старый текст" (будет слева).
$right_string(cтрока) (обязательный)
"Новый текст" (будет справа).
$args(cтрока/массив)

Аргументы функции. Можно установить заголовки в таблице:
title - заголовок общей таблицы. По умолчанию - пусто.
title_left - заголовок левой колонки таблицы. По умолчанию - пусто.
title_right - заголовок правой колонки таблицы. По умолчанию - пусто.

По умолчанию: null

Примеры

0

#1 Демонстрация сравнивания текстов

$string  = 'Старый текст что-то еще';
$string2 = 'Новый текст еще.';

echo wp_text_diff( $string , $string2, array(
	'title'       => 'Различия',
	'title_left'  => 'Старый',
	'title_right' => 'Новый',
) );

Этот код выведет следующее:

<table class='diff'>
	<col class='content' />
	<thead>
		<tr class='diff-title'>
			<th colspan='4'>Различия</th>
		</tr>
		<tr class='diff-sub-title'>
			<td></td>
			<th>Старый</th>
			<td></td>
			<th>Новый</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td class='diff-deletedline'><del>Старый</del> текст<del> что-то</del> еще </td>
			<td> </td>
			<td class='diff-addedline'><ins>Новый</ins> текст еще<ins>.</ins> </td>
		</tr>
	</tbody>
</table>

А выглядит так (зависит от css стилей вашей темы):

Различия
Старый Новый
Старый текст что-то еще   Новый текст еще.

Заметки

  • Смотрите: wp_parse_args() Used to change defaults to user defined settings.

Список изменений

С версии 2.6.0 Введена.

Код wp_text_diff() WP 6.5.2

function wp_text_diff( $left_string, $right_string, $args = null ) {
	$defaults = array(
		'title'           => '',
		'title_left'      => '',
		'title_right'     => '',
		'show_split_view' => true,
	);
	$args     = wp_parse_args( $args, $defaults );

	if ( ! class_exists( 'WP_Text_Diff_Renderer_Table', false ) ) {
		require ABSPATH . WPINC . '/wp-diff.php';
	}

	$left_string  = normalize_whitespace( $left_string );
	$right_string = normalize_whitespace( $right_string );

	$left_lines  = explode( "\n", $left_string );
	$right_lines = explode( "\n", $right_string );
	$text_diff   = new Text_Diff( $left_lines, $right_lines );
	$renderer    = new WP_Text_Diff_Renderer_Table( $args );
	$diff        = $renderer->render( $text_diff );

	if ( ! $diff ) {
		return '';
	}

	$is_split_view       = ! empty( $args['show_split_view'] );
	$is_split_view_class = $is_split_view ? ' is-split-view' : '';

	$r = "<table class='diff$is_split_view_class'>\n";

	if ( $args['title'] ) {
		$r .= "<caption class='diff-title'>$args[title]</caption>\n";
	}

	if ( $args['title_left'] || $args['title_right'] ) {
		$r .= '<thead>';
	}

	if ( $args['title_left'] || $args['title_right'] ) {
		$th_or_td_left  = empty( $args['title_left'] ) ? 'td' : 'th';
		$th_or_td_right = empty( $args['title_right'] ) ? 'td' : 'th';

		$r .= "<tr class='diff-sub-title'>\n";
		$r .= "\t<$th_or_td_left>$args[title_left]</$th_or_td_left>\n";
		if ( $is_split_view ) {
			$r .= "\t<$th_or_td_right>$args[title_right]</$th_or_td_right>\n";
		}
		$r .= "</tr>\n";
	}

	if ( $args['title_left'] || $args['title_right'] ) {
		$r .= "</thead>\n";
	}

	$r .= "<tbody>\n$diff\n</tbody>\n";
	$r .= '</table>';

	return $r;
}