Вставляем контент в WordPress после определенного количества абзацев

<?php
// Insert ads after second paragraph of single post content.
add_filter( 'the_content', 'prefix_insert_post_ads' );
function prefix_insert_post_ads( $content ) {

	$ad_code = '<div>Ads code goes here</div>';

	if ( is_single() && ! is_admin() ) {
		return prefix_insert_after_paragraph( $ad_code, 2, $content );
	}
return $content;
}
 
// Parent Function that makes the magic happen
function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
	$closing_p = '</p>';
	$paragraphs = explode( $closing_p, $content );
	foreach ($paragraphs as $index => $paragraph) {

		if ( trim( $paragraph ) ) {
			$paragraphs[$index] .= $closing_p;
		}

		if ( $paragraph_id == $index + 1 ) {
			$paragraphs[$index] .= $insertion;
		}
	}
	
	return implode( '', $paragraphs );
}

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Вставляем код после каждого H2 в контенте WordPress

Разберемся с одним из вариантов того, как можно вставить небольшой кусок кода в статьях после каждого заголовка H2.

Часто возникает необходимость вставить div с небольшим количеством содержимого сразу после закрывающегося тега h2 в одиночных записях WordPress.

Это может быть реклама или какой-то блок внимания.

Такая проблема решается небольшим сниппетом. Можно это сделать с помощью фильтра the_content. Ниже пример, который можно поместить в файл functions.php вашей темы:

function add_content_after_h2($content){
    if (is_single()) {
        $div = '<div>small bit of content</div>';
        $content = preg_replace('/(<\/h2>)/i', '\1'.$div, $content);
    }
    return $content;
}

add_filter('the_content', 'add_content_after_h2');

Для более подробной информации по этому фильтру можно посмотреть WordPress Codex.

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Как исправить ошибку 403 Forbidden в WordPress

Рассмотрим как исправить ошибку 403 Forbidden на вашем сайте WordPress, которая часто встречается после переноса сайтов.

Что это за ошибка

WordPress обычно показывает коды ошибок и сообщения при их возникновении ошибки на вашем сайте.

Ошибка 403 (Forbidden ) показывается, когда права доступа на вашем сервер не позволяют получить доступ к определенной странице.

Она, как правило, сопровождается текстом:

403 Forbidden – You don’t have permission to access ‘/’ on this server.

Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request.

Существуют различные сценарии, когда вы можете увидеть эту ошибку. Например:

  • 403 Forbidden – доступ запрещен на странице входа WordPress или на странице wp-admin
  • 403 Forbidden – во время установки WordPress
  • 403 Forbidden – при посещении любой страницы вашего сайта WordPress

Также возможно, что вы увидите только «Доступ запрещен» (Access Denied) вместо полного запрещенного статуса 403.

Вы также можете увидеть “Доступ к yourdomain.com был запрещен. У вас нет прав для просмотра этой страницы” (англ. – Access to yourdomain.com was denied. You don’t have authorization to view this page).

Теперь, когда вы знаете о различных типах ошибок 403, давайте поговорим о причинах этой ошибки.

Причины ошибки

Наиболее распространенная причина ошибки 403 Forbidden в WordPress связана с плохо настроенными плагинами безопасности.

Многие плагины безопасности WordPress могут блокировать IP-адрес (или целый ряд IP-адресов), если они считают их вредоносными.

Другой возможной причиной может быть неправильный или поврежденный файл .htaccess.

Кроме того могут быть неправильные права доступа к файлам на вашем сервере.

Ваш хостер может иногда вносить случайные изменения в настройки своего сервера, что, в свою очередь, может привести к ошибке 403 Forbidden на вашем сайте.

Ниже посмотрим как исправить ошибку 403 в WordPress.

Исправляем 403 ошибку

Прежде чем что-то делать, рекомендую создать полную резервную копию WordPress вашего сайта и Базы Данных.

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

1. Если виноват плагин

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

Если это действие решило вашу проблему, то это значтт, что один из плагинов на вашем сайте вызвал 403 ошибку.

Вы можете выяснить, какой из плагинов вызвал ошибку, активирую по очереди каждый плагин до тех пор, пока вы не сможете воспроизвести 403 forbidden.

2. Проблема с .htaccess

Часто ошибка 403 вызвана поврежденным файлом .htaccess на вашем сайте WordPress. Восстановить этот файл довольно просто.

Сначала вам нужно подключиться к вашему сайту, используя FTP-клиент или файловый менеджер в cPanel.

Далее, найдите файл .htaccess в корневой папке вашего сайта WordPress.

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

Попробуйте зайти на свой сайт. Если 403 ошибка пропала, то это означает, что ваш файл .htaccess был поврежден или неверно заполнен.

Вы можете сгенерировать новый .htaccess файл, войдя в вашу административную панель WordPress и перейдя на страницу “Настройки -> Постоянные ссылки” (англ. – Settings -> Permalinks).

Просто нажмите на кнопку “Сохранить изменения” (Save Changes) в нижней части страницы и WordPress сгенерирует новый файл .htaccess.

3. Проблема с разрешениями файлов и папок

Все файлы, хранящиеся на вашем сайте, имеют права доступа. Эти права доступа к файлам определяют, кто имеет доступ к файлам и папкам на вашем сайте.

Неправильные права доступа к файлу могут вызвать ошибку запрета 403. Веб-сервер считает, что у вас нет прав доступа к этим файлам.

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

Вы можете попросить своего хостинг-провайдера проверить ваш веб-сайт на предмет правильных прав доступа к файлам. Некоторые провайдеры, типа Beget, очень внимательные и помогут исправить проблему.

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

Однако, если Вы хотите сделать это самостоятельно, то ниже разберем как Вы можете проверить свои права доступа к файлам.

Просто подключитесь к своему WordPress сайту с помощью FTP-клиента. Перейдите в корневую папку, содержащую все Ваши файлы WordPress.

Щелкните правой кнопкой мыши на нужную папку и выберите в меню пункт File Permissions (Права доступа к файлам).

Ваш FTP-клиент покажет вам диалоговое окно с разрешениями для файлов, подобное этому:

Все папки на вашем сайте WordPress должны иметь файловое разрешение 744 или 755.

Все файлы на сайте WordPress должны иметь разрешение 644 или 640.

Вы можете установить разрешение для корневой папки на 744 или 755.

Поставьте галочку напротив ‘Recurse into subdirectories’ (Запись в подкаталоги), а затем поставьте галочку напротив опции ‘Apply to directories only’ (Применять только к каталогам).

Нажмите на кнопку OK. Теперь ваш FTP клиент начнет задавать разрешения для всех подкаталогов в этой папке.

После этого нужно повторить процесс для всех файлов. На этот раз вы воспользуетесь файловыми разрешениями 644 или 640 и не забудьте выбрать опции ‘Recurse into subdirectories’ (Запись в подкаталоги) и ‘apply to files only’ (Применять только к файлам).

Нажмите кнопку OK, и ваш FTP клиент начнет установку файловых разрешений для всех выбранных файлов.

После данных операций попробуйте войти на сайт, 403 ошибка должна исчезнуть.

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Парсинг JSON в PHP

В этом материале мы рассмотрим как кодировать и декодировать JSON данные в PHP.

Что такое JSON

JSON означает JavaScript Object Notation (нотация объектов JavaScript). JSON – это стандартный облегченный формат обмена данными, который быстро и легко анализировать и генерировать.

JSON, как и XML, является текстовым форматом, который легко пишется и понятен как людям, так и компьютерам, но в отличие от XML, структуры данных JSON занимают меньше полосы пропускания, чем их XML-версии. JSON основан на двух основных структурах:

  • Объект (Object): Определяется как набор пар ключ/значение (т.е. key:value). Каждый объект начинается с левой фигурной скобки { и заканчивается правой фигурной скобкой }. Несколько пар ключ/значение разделены запятой ,.
  • Массив (Array): Определяется как упорядоченный список значений. Массив начинается с левой скобки [ и заканчивается правой скобкой ]. Значения разделены запятой ,.

В JSON ключами всегда являются строки, а значением может быть строка, число, true или false, null или даже объект или массив. Строки должны быть заключены в двойные кавычки " и могут содержать экранирующие символы, такие как \n, \t и \. JSON объект может выглядеть так:

{
    "book": {
        "name": "Harry Potter and the Goblet of Fire",
        "author": "J. K. Rowling",
        "year": 2000,
        "genre": "Fantasy Fiction",
        "bestseller": true
    }
}

В то время как пример массива JSON будет выглядеть примерно так:

{
    "fruits": [
        "Apple",
        "Banana",
        "Strawberry",
        "Mango"
    ]
}
Формат обмена данными – это текстовый формат, который используется для обмена данными между различными платформами и операционными системами. JSON является наиболее популярным и легковесным форматом обмена данными для веб-приложений.

Парсинг

Структуры данных JSON очень похожи на массивы PHP. PHP имеет встроенные функции для кодирования и декодирования данных JSON. Этими функциями являются json_encode() и json_decode() соответственно. Обе функции работают только с строковыми данными в кодировке UTF-8.

Кодирование JSON данных

В PHP функция json_encode() используется для кодирования значения в формат JSON.

Кодируемое значение может быть любым типом данных PHP, кроме ресурса, например, базы данных или дескриптора файла. В приведенном ниже примере показано, как кодировать ассоциативный массив PHP в объект JSON:

<?php
// ассоциативный массив
$marks = array("Peter"=>65, "Harry"=>80, "John"=>78, "Clark"=>90);
 
echo json_encode($marks);
?>

Вывод вышеприведенного примера будет выглядеть следующим образом:

{"Peter":65,"Harry":80,"John":78,"Clark":90}

Точно так же вы можете закодировать индексированный массив PHP в массив JSON, например так:

<?php
// индексированный массив
$colors = array("Red", "Green", "Blue", "Orange", "Yellow");
 
echo json_encode($colors);
?>

Вывод вышеприведенного примера будет выглядеть следующим образом:

["Red","Green","Blue","Orange","Yellow"]

Вы также можете заставить функцию json_encode() возвращать индексированный массив PHP как объект JSON, используя опцию JSON_FORCE_OBJECT, как показано в примере ниже:

<?php
// индексированный массив
$colors = array("Red", "Green", "Blue", "Orange");
 
echo json_encode($colors, JSON_FORCE_OBJECT);
?>

Вывод вышеприведенного примера будет выглядеть следующим образом:

{"0":"Red","1":"Green","2":"Blue","3":"Orange"}

Как вы можете видеть в приведенных выше примерах, неассоциативный массив может быть закодирован как массив или объект. Однако ассоциативный массив всегда кодируется как объект.

Декодирование данных JSON

Декодирование данных JSON так же просто, как и их кодирование. Вы можете использовать функцию PHP json_decode() для преобразования строки в кодировке JSON в соответствующий тип данных PHP. В следующем примере показано, как декодировать или преобразовать объект JSON в объект PHP.

<?php
// сохранение данных JSON в переменной PHP
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
var_dump(json_decode($json));
?>

Вывод вышеприведенного примера будет выглядеть примерно так:

object(stdClass)#1 (4) { ["Peter"]=> int(65) ["Harry"]=> int(80) ["John"]=> int(78) ["Clark"]=> int(90) }

По умолчанию функция json_decode() возвращает объект. Однако можно дополнительно указать второй параметр $assoc, который принимает булевое значение, при котором при установке в качестве true JSON объекты декодируются в ассоциативные массивы. По умолчанию оно равно false. Приведем пример:

<?php
// сохранение данных JSON в переменной PHP
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
var_dump(json_decode($json, true));
?>

Вывод вышеприведенного примера будет выглядеть примерно так:

array(4) { ["Peter"]=> int(65) ["Harry"]=> int(80) ["John"]=> int(78) ["Clark"]=> int(90) }

Теперь рассмотрим пример, который покажет, как декодировать JSON-данные и получить доступ к отдельным элементам JSON-объекта или массива в PHP.

<?php
// присвоение строки в кодировке JSON переменной PHP
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
// декодировать JSON данные в ассоциативный массив PHP
$arr = json_decode($json, true);
// доступ к значениям из ассоциативного массива
echo $arr["Peter"];  // вывод: 65
echo $arr["Harry"];  // вывод: 80
echo $arr["John"];   // вывод: 78
echo $arr["Clark"];  // вывод: 90
 
// декодировать JSON данные в объект PHP
$obj = json_decode($json);
// доступ к значениям из возвращенного объекта
echo $obj->Peter;   // вывод: 65
echo $obj->Harry;   // вывод: 80
echo $obj->John;    // вывод: 78
echo $obj->Clark;   // вывод: 90
?>

Также можно перебирать декодированные данные, используя цикл foreach():

<?php
// присвоение строки в кодировке JSON переменной PHP
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
// декодировать JSON данные в ассоциативный массив PHP
$arr = json_decode($json, true);
 
// цикл по ассоциативному массиву
foreach($arr as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
echo "<hr>";
// декодировать JSON данные в объект PHP
$obj = json_decode($json);
 
// перебираем объект в цикле
foreach($obj as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
?>

Извлечение значений из вложенных данных JSON в PHP

Объекты и массивы JSON также могут быть вложенными. Объект JSON может произвольно содержать другие объекты JSON, массивы, вложенные массивы, массивы объектов JSON и т.д. В следующем примере показано, как декодировать вложенный объект JSON и вывести все его значения в PHP.

<?php
// Определение рекурсивной функции для извлечения вложенных значений
function printValues($arr) {
    global $count;
    global $values;
    
    // проверяем массив ли на входе
    if(!is_array($arr)){
        die("ERROR: Input is not an array");
    }
    
    /*
    Проходим по массиву, если значение само является массивом, рекурсивно вызываем функцию, иначе добавляем найденное значение в массив выходных элементов и увеличиваем счетчик на 1 для каждого найденного значения
    */
    foreach($arr as $key=>$value){
        if(is_array($value)){
            printValues($value);
        } else{
            $values[] = $value;
            $count++;
        }
    }
    
    // возвращаем суммарное количество и значения, найденные в массиве
    return array('total' => $count, 'values' => $values);
}
 
// присваиваем переменной PHP строку в кодировке JSON
$json = '{
    "book": {
        "name": "Harry Potter and the Goblet of Fire",
        "author": "J. K. Rowling",
        "year": 2000,
        "characters": ["Harry Potter", "Hermione Granger", "Ron Weasley"],
        "genre": "Fantasy Fiction",
        "price": {
            "paperback": "$10.40", "hardcover": "$20.32", "kindle": "4.11"
        }
    }
}';
// декодирование данных JSON в формате ассоциативного массива PHP
$arr = json_decode($json, true);
 
// Вызываем функцию и выводим все значения
$result = printValues($arr);
echo "<h3>" . $result["total"] . " value(s) found: </h3>";
echo implode("<br>", $result["values"]);
 
echo "<hr>";
 
// Выводим одиночные значения
echo $arr["book"]["author"] . "<br>";  // Output: J. K. Rowling
echo $arr["book"]["characters"][0] . "<br>";  // Output: Harry Potter
echo $arr["book"]["price"]["hardcover"];  // Output: $20.32
?>

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Более 847 млн страниц не получают трафик от Google

Сайт Ahrefs в своем материале привел большое количество статистических выводов относительно SEO.

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

Как мы видим – 90,63% страниц вообще не получают поискового трафика от Google. По подсчетам ahrefs их 847 833 932.

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

К этим 90,63% можно прибавить 5,29% (1-10 визитов) и еще 2,84% (11-100 визитов). Кроме того, я бы добавил еще 1,04% (101-1000 визитов).

Почему мы прибавляем другие срезы? Потому как экономически не выгодно малое количество визитов.

В итоге мы получаем интересную цифру в 99,8%.

Т.е. для 99,8% страниц Google не может являться инструментом для привлечения экономически-выгодного трафика. Вы еще хотите пойти в SEO?

Для дополнительных раздумий можно развить еще одну интересную мысль. Всего по Ahrefs больше 1000 визитов от Google (скорее всего в месяц) получают 2 094 758 страниц. Много ли это?

Давайте посмотрим сколько страниц проиндексировано в Google, например, у крупного новостного сайта “New York Times”? Получаем 8 670 000 страниц.

Можно сделать интересный вывод, что 2 млн страниц, получающие трафик от Google – это даже не смешно, это катастрофа.

Даже с точки зрения вероятности основной трафик забирают именно такие крупные проекты с большим индексом в Google. Конечно, вывод не однозначный, но вряд ли сильно ошибочный.

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Выводим количество статей в категории WordPress

// $ID заменяем на ID нужной категории с кавычками, например: '38'

<?php 
$cat_count = get_category($ID);
echo $cat_count->count; 
?>

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Показываем суммарное количество статей во всех дочерних категориях WordPress

Решаем задачу вывода суммарного количества статей во всех дочерних категориях WordPress на фронтенд.

На отдельном клиентском сайте была небольшая задача вывода количества статей в сумме по всем дочерним категориям одного родителя.

Предположим у нас такая иерархия:

Cars-1 (всего статей – 0)
Cars-2 (всего статей – 4)
Cars-3 (всего статей – 3)
Cars-4 (всего статей – 3)

Нужно было показать сколько всего статей содержит Cars-1 включая Cars-2, Cars-3, Cars-4. Т.е. на выходе мы должны получить 10.

Это делается с использованием небольшой функции, которую можно добавить в functions.php и потом использовать где нужно на сайте:

function wp_get_cat_postcount($id) {
    $cat = get_category($id);
    $count = (int) $cat->count;
    $taxonomy = 'category';
    $args = array(
        'child_of' => $id,
    );
    $tax_terms = get_terms($taxonomy,$args);
    foreach ($tax_terms as $tax_term) {
        $count +=$tax_term->count;
    }

    return $count;
}

Теперь, в нужном месте нашего сайта мы добавляем такую строчку:

<?php echo wp_get_cat_postcount('1'); ?>

Мы указали ID рубрики ‘1’ и теперь у нас выведется количество статей во всех подкатегориях родителя.

Эту строчку можно вставить в любой файл темы, где вам нужно, например, index.php или archive.php.

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Git: команды

Собрал в одном месте git команды на каждый день, мини справочник, который всегда под рукой.

В планах сделать более серьезный материал по Git, т.к. с ним у многих начинающих, да и не только, разработчиков много проблем и вопросов.

Для тех, кто только начал работу с Git советую прочитать на сайте статью под названием Отправка первого локального проекта на GitHub.

Инициализация нового git-репозитория:

git init

Отобразить статус git-репозитория и рабочего каталога:

git status

Добавить в индекс все измененные файлы:

git add .

Добавить в индекс изменения:

git add <filename>

Удалить файл с внесением в индекс:

git rm <filename>

Переименование файла/перенос в другую директорию с внесением в индекс:

git mv <filename>

Зафиксировать изменения в репозитории, находящиеся в индексе:

git commit -m "<message>"

Комбо:

git commit -a -m "<message>" = git add . + git commit -m "<message>"

История коммитов:

git log

Переход к старому состоянию проекта:

git checkout <hash>

Переход к старому состоянию проекта и удалению последующих фиксаций (параметр --hard указывает, что рабочий каталог должен быть обновлен в соответствии с новым head ветки):

git reset --hard <hash>

Клонирование проекта из удаленного репозитория

git clone <откуда> <куда>

Примеры git clone:

git clone ssh://dmn@192.168.1.100:22/var/www/superproject/htdocs/.git superproject
git clone /home/username/project myrepo
git clone http://user@somehost:port/~user/repository/project.git
git clone --bare hello hello.git

Последний пример создает т.н. “чистый” репозиторий. “Чистые” репозитории не хранят рабочие каталоги и обычно используются для расшаривания.

Обычный git-репозиторий подразумевает, что вы будете использовать его как рабочую директорию, поэтому вместе с файлами проекта в актуальной версии, git хранит все служебные, “чисто”-репозиториевские файлы в поддиректории .git.

В удаленных репозиториях нет смысла хранить рабочие файлы на диске (как это делается в рабочих копиях), а все что им действительно нужно — это дельты изменений и другие бинарные данные репозитория. Вот это и есть «чистый” репозиторий.

Получение изменений из удаленного репозитория и их слияние с локальным:

git pull

Внесение локальных изменений на удаленный:

git push

Просмотр веток:

git branch

Добавление ветки:

git branch <имя_ветки>

Удаление ветки:

git branch <имя_ветки> -d

Переход между ветками:

git checkout <имя_ветки>

Слияние двух веток:

git merge <имя_ветки>

Дополнительные материалы:

Интерактивный учебник по git

Большая книга по git

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.