Как добавить кнопку лайков в записи WordPress без использования плагинов

Существует множество плагинов для добавления кнопки лайков к записям WordPress. Многие из них включают в себя функции, которые вы никогда не будете использовать. А их код будет замедлять сайт.

В этой статье я расскажу, как создать собственный «счетчик лайков» для записей WordPress с помощью HTML, CSS и PHP.

Содержание

1.HTML

Сначала создадим HTML-структуру, состоящую из двух одинаковых кнопок. В данном примере я редактирую стандартную WordPress- тему Twenty Sixteen.

<ul class="likes">
	<li class="likes__item likes__item--like">
		<a href="#">
			Like (0)
		</a>
	</li>
	<li class="likes__item likes__item--dislike">
		<a href="#">
			Dislike (0)
		</a>
	</li>
</ul>

Чтобы отобразить кнопки, нужно добавить их перед записью с помощью фильтра the_content.

<?php
	function ip_post_likes($content) {
		// Проверяем, является ли это одиночной записью
		if(is_singular('post')) {
			// Начинаем выводить буфер
			ob_start();

			?>
				<ul class="likes">
					<li class="likes__item likes__item--like">
						<a href="#">
							Like (0)
						</a>
					</li>
					<li class="likes__item likes__item--dislike">
						<a href="#">
							Dislike (0>)
						</a>
					</li>
				</ul>
			<?php

			// Завершаем выводить буфер и добавляем вывод в переменную
			$output = ob_get_clean();

			// Объединяем кнопки с контентом записи
			return $output . $content;
		}else {
			// Возвращаем контент страниц и записей других типов без изменений
			return $content;
		}
	}

	add_filter('the_content', 'ip_post_likes');
?>

Рассмотрим приведенный выше код. Сначала мы создаем функцию ip_post_likes(), которая принимает параметр $content.

function ip_post_likes($content) {

}

Она проверяет, просматриваем ли мы одиночную запись.

if(is_singular('post')) {

}

Далее мы используем буферизацию вывода. С ее помощью мы присваиваем переменной содержимое буфера. Мы начинаем буфер с ob_start(); и заканчиваем ob_get_clean(). В нашем случае переменная называется $output.

<?php ob_start(); ?>
<p>
	Здесь какой-то HTML-контент!
</p>
<?php $output = ob_get_clean(); ?>

Затем мы объединяем переменные $output и $content. При использовании фильтра the_content переменная $content- это содержимое публикации, которое будет выводиться на странице. В результате объединения этих переменных кнопки лайков будут размещаться прямо перед содержимым публикации.

return $output . $content;

Последнее, что мы делаем в этой функции, это добавляем оператор else, чтобы сказать: «Если это не одиночная запись, выведите контент без изменений». Если бы мы этого не сделали, все остальные типы постов не имели бы контента.

if(is_singular('post')) {
	return $output . $content;
}else {
	return $content;
}

Затем мы прикрепляем функцию к фильтру the_content.

add_filter('the_content', 'ip_post_likes');

Вот что вы должны иметь на данный момент…

2. CSS

Вот как выглядит готовый CSS-код кнопок:

.likes {
	display: flex;
}

.likes__item {
	list-style: none;
}

.likes__item:not(:last-child) {
	margin-right: 20px;
}

.likes__item a {
	padding: 10px 15px;
	display: inline-block;
	border-bottom: 2px solid;
	border-radius: 3px;
	box-shadow: none;
	background: #f5f5f5;
	font-size: 14px;
	font-weight: bold;
	text-transform: uppercase;
	letter-spacing: 1px;
	line-height: 100%;
}

.likes__item a:hover {
	color: #fff;
}

.likes__item--like a {
	border-bottom-color: #47ba72;
	color: #47ba72;
}

.likes__item--dislike a {
	border-bottom-color: #ba6547;
	color: #ba6547;
}

.likes__item--like a:hover {
	background: #47ba72;
}

.likes__item--dislike a:hover {
	background: #ba6547;
}

Я использую :not(:last-child) , чтобы добавить отступ каждому элементу, кроме последнего.

.likes__item:not(:last-child) {
	margin-right: 20px;
}

Вот как это должно выглядеть с CSS .

3. PHP

Сначала создадим функцию для получения лайков и дизлайков к записи. Она понадобится позже

Функция получает текущее количество лайков и дизлайков из базы данных. Если не найдено ни одного лайка или дизлайка, тогда их количество равно 0.

Функция принимает аргумент $type. Он принимает значение произвольного мета-поля записи, которое мы создадим через мгновение. Функция по умолчанию находит «лайки».

function ip_get_like_count($type = 'likes') {
	$current_count = get_post_meta(get_the_id(), $type, true);

	return ($current_count ? $current_count : 0);
}

Следующая часть PHP была рассмотрена в разделе с HTML. Но здесь есть разница — ​​использование только что созданной функции ip_get_like_count(). Сначала она должна выводить 0.

<?php
	function ip_post_likes($content) {
		// Проверяем, является ли это одиночной записью
		if(is_singular('post')) {
			ob_start();

			?>
				<ul class="likes">
					<li class="likes__item likes__item--like">
						<a href="<?php echo add_query_arg('post_action', 'like'); ?>">
							Like (<?php echo ip_get_like_count('likes') ?>)
						</a>
					</li>
					<li class="likes__item likes__item--dislike">
						<a href="<?php echo add_query_arg('post_action', 'dislike'); ?>">
							Dislike (<?php echo ip_get_like_count('dislikes') ?>)
						</a>
					</li>
				</ul>
			<?php

			$output = ob_get_clean();

			return $output . $content;
		}else {
			return $content;
		}
	}

	add_filter('the_content', 'ip_post_likes');
?>

Помимо ip_get_like_count() мы используем функцию add_query_arg(). Она берет текущий URL-адрес и добавляет к нему строку запроса. Например, у меня на локальном сервере WordPress установлен в каталоге /wordpress/. Поэтому URL-адрес будет /wordpress/2018/08/02/hello-world/?post_action=like.

<?php echo add_query_arg('post_action', 'like'); ?>

Создадим функцию, которая обрабатывает лайки путем обновления метаданных.

function ip_process_like() {
	$processed_like = false;
	$redirect       = false;

	// Проверяет, это лайк или дизлайк
	if(is_singular('post')) {
		if(isset($_GET['post_action'])) {
			if($_GET['post_action'] == 'like') {
				// Лайк
				$like_count = get_post_meta(get_the_id(), 'likes', true);

				if($like_count) {
					$like_count = $like_count + 1;
				}else {
					$like_count = 1;
				}

				$processed_like = update_post_meta(get_the_id(), 'likes', $like_count);
			}elseif($_GET['post_action'] == 'dislike') {
				// Дизлайк
				$dislike_count = get_post_meta(get_the_id(), 'dislikes', true);

				if($dislike_count) {
					$dislike_count = $dislike_count + 1;
				}else {
					$dislike_count = 1;
				}

				$processed_like = update_post_meta(get_the_id(), 'dislikes', $dislike_count);
			}

			if($processed_like) {
				$redirect = get_the_permalink();
			}
		}
	}

	// Редирект
	if($redirect) {
		wp_redirect($redirect);
		die;
	}
}

add_action('template_redirect', 'ip_process_like');

Разберем приведенный выше код более подробно.

Сначала мы создаем две переменные: $processed_like и $redirect. Установим для них значение false в самом верху функции.

function ip_process_like() {
	$processed_like = false;
	$redirect       = false;
}

Далее мы проверяем, имеем ли дело с одиночной записью. Если это так, проверяем, установлена ​​ли переменная $_GET[‘post_action’]. Если да, то мы можем отследить, пытается ли пользователь поставить отметку «нравится» или «не нравится».

// Проверяем, это лайк или дизлайк
if(is_singular('post')) {
	if(isset($_GET['post_action'])) {
		if($_GET['post_action'] == 'like') {
			// Лайк
		}elseif($_GET['post_action'] == 'dislike') {
			// Дизлайк
		}
	}
}

После этого задаем базовый код в каждой части оператора if / else, который говорит: «получить лайки к текущему посту; если они есть, добавить 1; если нет, начать с 1» . Та же логика применима к обеим частям, мы просто заменяем ‘like’ на ‘dislike’ в выражении else.

// Лайк
$like_count = get_post_meta(get_the_id(), 'likes', true);

if($like_count) {
	$like_count = $like_count + 1;
}else {
	$like_count = 1;
}

$processed_like = update_post_meta(get_the_id(), 'likes', $like_count);

Используя функцию update_post_meta(), мы обновляем метаданные записи.

Затем проверяем, равна ли переменная $processed_like true. Если метаданные обновлены, то она будет равно true. Потому что update_post_meta() при успешном выполнении возвращает значение true. Если это так, мы устанавливаем текущую постоянную ссылку в качестве редиректа.

Если бы мы не загрузили страницу с ?post_action=like еще в URL-е, тогда, когда пользователь скопировал бы этот URL-адрес или просто обновил страницу, это добавило бы еще один лайк.

if($processed_like) {
	$redirect = get_the_permalink();
}

Редирект запускается только в том случае, если переменная $redirect имеет значение true.

// Редирект
if($redirect) {
	wp_redirect($redirect);
	die;
}

Чтобы этот код работал, запускаем его с действием template_redirect, которое выполняется до того, как WordPress выберет шаблон для текущей записи.

add_action('template_redirect', 'ip_process_like');

4. Окончательный код

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

<?php
//---- Добавляем кнопки выше содержимого записи
function ip_post_likes($content) {
// Проверяем, является ли это одиночной записью
if(is_singular('post')) {
ob_start();

?>
<ul class="likes">
<li class="likes__item likes__item--like">
<a href="<?php echo add_query_arg('post_action', 'like'); ?>">
Like (<?php echo ip_get_like_count('likes') ?>)
</a>
</li>
<li class="likes__item likes__item--dislike">
<a href="<?php echo add_query_arg('post_action', 'dislike'); ?>">
Dislike (<?php echo ip_get_like_count('dislikes') ?>)
</a>
</li>
</ul>
<?php

$output = ob_get_clean();

return $output . $content;
		}else {
		return $content;
		}
	}

	add_filter('the_content', 'ip_post_likes');

	//---- Получаем количество лайков и дизлайков
	function ip_get_like_count($type = 'likes') {
		$current_count = get_post_meta(get_the_id(), $type, true);

		return ($current_count ? $current_count : 0);
	}

	//---- Обрабатываем лайки и дизлайки
	function ip_process_like() {
		$processed_like = false;
		$redirect       = false;

		// Проверяем, это лайк или дизлайк
		if(is_singular('post')) {
			if(isset($_GET['post_action'])) {
			if($_GET['post_action'] == 'like') {
			// Лайк
			$like_count = get_post_meta(get_the_id(), 'likes', true);

				if($like_count) {
					$like_count = $like_count + 1;
					}else {
						$like_count = 1;
					}

	$processed_like = update_post_meta(get_the_id(), 'likes', $like_count);
				}elseif($_GET['post_action'] == 'dislike') {
					// Дизлайк
		$dislike_count = get_post_meta(get_the_id(), 'dislikes', true);

					if($dislike_count) {
					$dislike_count = $dislike_count + 1;
					}else {
						$dislike_count = 1;
					}

$processed_like = update_post_meta(get_the_id(), 'dislikes', $dislike_count);
				}

				if($processed_like) {
					$redirect = get_the_permalink();
				}
			}
		}

		// Редирект
		if($redirect) {
			wp_redirect($redirect);
			die;
		}
	}

	add_action('template_redirect', 'ip_process_like');
?>

CSS

.likes {
	display: flex;
}

.likes__item {
	list-style: none;
}

.likes__item:not(:last-child) {
	margin-right: 20px;
}

.likes__item a {
	padding: 10px 15px;
	display: inline-block;
	border-bottom: 2px solid;
	border-radius: 3px;
	box-shadow: none;
	background: #f5f5f5;
	font-size: 14px;
	font-weight: bold;
	text-transform: uppercase;
	letter-spacing: 1px;
	line-height: 100%;
}

.likes__item a:hover {
	color: #fff;
}

.likes__item--like a {
	border-bottom-color: #47ba72;
	color: #47ba72;
}

.likes__item--dislike a {
	border-bottom-color: #ba6547;
	color: #ba6547;
}

.likes__item--like a:hover {
	background: #47ba72;
}

.likes__item--dislike a:hover {
	background: #ba6547;
}

Предварительный просмотр

Данная публикация представляет собой перевод статьи «How To Add Likes to Posts in WordPress (Without a Plugin)» , подготовленной дружной командой проекта Интернет-технологии.ру

Меню