Оптимизируем title для wordpress

Попробуем поменять титл в вордпрессе, то есть cделать так чтобы для каждой страницы был разный (оптимальный) title. Обычно практически все стандартные темы или темы с паблика имеют такой стандартный вид отображения титла:

<title><?php bloginfo('name'); ?> <?php if ( is_single() ) { ?> » Blog Archive <?php } ?> <?php wp_title(); ?></title>

Конечно это не самый лучший способ отображения титла вашего wordpress. Конечно же есть другой, более оптимизированный под для поисковых машин способ отображения титла. Например я предпочитаю вот этот код:
<title><?php if (is_home () ) { bloginfo(‘name’); }
elseif ( is_category() ) { single_cat_title(); echo ‘ - ‘ ; bloginfo(‘name’); }
elseif (is_single() ) { single_post_title();}
elseif (is_page() ) { single_post_title();}
else { wp_title(‘’,true); } ?></title>

Этот код отображает для каждого вида страницы разный титл, то есть для простой страницы титлом будет его название, для главной название блога и т.д. Но если вы не хотите мучатся то можно просто воспользоваться плагинами. Такими как SEO Tittle Tag который позволяет для каждого поста указывать свой титл он может быть любым даже не совпадать с названием поста, All-in-One SEO Pack который позволяет манипулировать всеми мета тэгами любой страницы вашего блога.

Добавлено: 13 Июля 2018 07:27:40 Добавил: Андрей Ковальчук

noindex в ссылке на сайт автора комментария

В WordPress, по умолчанию, ссылки на сайты авторов комментариев не будут учитываться поисковой системой Google, поскольку в них размещается параметр rel=”nofollow”.

Возникла задача скрыть эти ссылки и от Яndexa. Понятно, что для этого ссылку надо закрывать тегами <noindex></noindex>. Как это сделать в WordPress?

Вариант 1.

В папке wp-includes в файле comment-template.php находим функцию get_comment_author_link(). Эта функция как раз и формирует линк на сайт автора комментария.

Добавляем в результат, возвращаемый функцией, теги :

$return = "<strong><noindex></strong><a href='$url' rel='external nofollow' class='url'>
               $author</a><strong></noindex></strong>";

Вариант 2.

Сразу скажу, что мне вариант 1 не помог, поскольку в теме iNove формирование данного линка происходит в функции

\wp-content\themes\inove\functions.php вот таким образом:
<div class="name">

   <?php if (get_comment_author_url()) : ?>

      <strong><noindex></strong><a target="_blank"<strong> rel="nofollow"</strong>
                  href="<?php comment_author_url() ?>">

   <?php else : ?>

      <span id="commentauthor-<?php comment_ID() ?>">

   <?php endif; ?>

   <?php comment_author(); ?>

   <?php if(get_comment_author_url()) : ?>

      </a<strong>></noindex></strong>

   <?php else : ?>

      </span>

   <?php endif; ?>

</div>

Как видите, я уже добавил в нужных местах <noindex> и </noindex>. Также тут не было параметра rel=”nofollow”.

Вариант 3.

Возможно, для Вашей темы подойдет такой вариант.

В файле comments.php Вашей темы надо заключить ссылку автора комментария в теги :
<noindex><?php comment_author_link() ?></noindex>

Добавлено: 12 Июля 2018 21:41:31 Добавил: Андрей Ковальчук

Борьба со спамом

Я не единственный наверное кого заколебал спам, существует много способов борьбы с ним. Чаще всего ставят капчу, это обычно картинка с цифрами которые нужно ввести в поле для подтверждения того что вы не бот, иногда ставят просто галочку которую нужно выбрать, существует еще куча извращенных способов суть которых одна, добавление лишнего поля. Но как же быть если я не хочу добавлять лишнего поля в форму, хочу оставить все как есть и так избавиться от спама? Предлагаю поставить проверку на включенность Javascript‘a. Сделать это очень даже легко на PHP, если конечно ваш хостинг включил поддержку функции get_browser():

function workjscript(){
     $brows = get_browser();
     if($brows[javascript]){
         return true;  //то есть выводим форму
     }
     retunr false; //javascript не включен форму не выводим
}

Но а если get_browser() не поддерживается вашм хостингом также как и у меня, можно сделать попроще, просто выводить одно из обязательных полей через Javascritpt. В итоге без Javascript‘a пользователь, спам бот или кто еще пофигу будет получать форму без одного обязательного поля и не сможет отправить форму. Ну на примере wordpress для комментариев можно передать в качестве поля имени автора следующее:
'author' => '<div class="first_inputs">
        <span id="authorplace"></span>
        <script type="text/javascript">
                $(document).ready(function(){
                        $("#authorplace").html("\
                                <input class=\"cm_name\" placeholder=\"Имя\" id=\"author\" name=\"author\" type=\"text\" value=\"'.esc_attr( $commenter['comment_author'] ) . '\"' . $aria_req . ' />\
                        ");
                });
        </script>',

Добавлено: 24 Июня 2018 08:44:16 Добавил: Андрей Ковальчук

Отделение трекбеков от комментариев

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

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

Комментарии - это живое общение между людьми, и не стоит сюда примешивать машинно-сгенерированные ссылки. Метод, который описан ниже позволит Вам создать отдельный список комментариев, а также отдельный список трекбеков.

Как же отделить трекбеки?

Необходимо открыть файл comments.php Вашей темы и найти следующую строку:

<?php foreach ($comments as $comment) : ?>

После нее необходимо вставить:
<?php $comment_type = get_comment_type(); ?>

<?php if($comment_type == 'comment') { ?>

Теперь найдите:
<?php endforeach; /* end for each comment */ ?>

И перед этой строкой вставьте:
<?php } else { $trackback = true; } /* End of is_comment statement */ ?>

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

Найдите следующую строку:
<?php else : // this is displayed if there are no comments so far ?>

И вставьте следующее:
<?php if ($trackback == true) { ?>
<h3>Trackbacks</h3>
<ol>
<?php foreach ($comments as $comment) : ?>
<?php $comment_type = get_comment_type(); ?>

<?php if($comment_type != 'comment') { ?>
<li><?php comment_author_link() ?></li>
<?php } ?>
<?php endforeach; ?>

</ol>
<?php } ?>

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

У некоторых может возникнуть вопрос: "Для чего нужны мне эти трекбеки?". С точки зрения поисковой оптимизации - это лишние внешние ссылки, что не есть очень хорошо. С точки зрения обмена посетителями - это нормальный ход. Дело в том, что блогеры гораздо охотнее поставят ссылку на блог с трекбеками, чем на блог без них (это при условии, что оба блога интересны в одинаковой степени). Таким образом, кто-либо из посетителей того блога скорее всего перейдет по ссылке на Ваш блог.

Спасибо за внимание! До следующих уроков.

Добавлено: 24 Мая 2018 19:24:22 Добавил: Андрей Ковальчук

Многоколоночный контент в WordPress с использованием Twitter Bootstrap

Я недавно начал использовать Twitter Bootstrap в своих проектах, но полюбил я его сразу. Вот несколько причин по которым его стоит использовать:

Создан профессиональным инженером идизайнером из Twitter’а, Bootstrap используетLESS CSS, скомпилированный через Node, и управляемы через GitHub дабы помочь ботанам создавать уникальный контент в Сети.
Bootstrap создан не только для красивого отображения в самых современных браузерах, Bootstrap теперь работает даже в IE7!, а так же на Планшетах и Смартфонах благодарядинамическому CSS.
2 колонный динамический дизайн и сетка, сотни компонентов, javascript-плагины, шрифты, формы, а так же web-Кастомизатор, который позволит скачать только необходимые Вам компоненты в нужном виде.
Первое что я делал используя Twitter Bootstrap — это автоматическая генерация многоколоночного контента для кастомного типа постов. Идея простая — есть определенный layout, который хранится в JSON-файле (макет лэйоута страницы. В нем хранятся строки, колонки в каждой строке и контент каждой колонки), этот файл передается в функцию рендеринга, которая возвращает html-макет страницы.


Вот пример JSON-макета страницы:

{
	"title":"New Layout",
	"alias":"layout-1365763296",
	"body_structure":{
		"row_0":{
			"column_0":{
				"content_elements":{
					"element-0":{
						"content_type":"default_content",
						"content_source":""}
						},
					"grid_position":"4"
			},
			"column_1":{
				"content_elements":{
					"element-0":{
						"content_type":"default_content",
						"content_source":""
					}
				},
				"visible_on":["desktop","tablet","phone"],
				"grid_position":"8"
			},
			"column_2":{
				"content_elements":{
					"element-0":{
						"content_type":"default_content",
						"content_source":""
						}
					},
				"visible_on":["desktop","tablet","phone"],
				"grid_position":"12"
			}
		},
		"row_1":{
			"column_0":{
				"content_elements":{
					"element-0":{
						"content_type":"default_content",
						"content_source":""
					}
				},
				"visible_on":["desktop","tablet","phone"],
				"grid_position":"6"
			},
			"column_1":{
				"content_elements":{
					"element-0":{
						"content_type":"default_content",
						"content_source":""
					}
				},
				"visible_on":["desktop","tablet","phone"],
				"grid_position":"12"
			}
		}
	}
}

Мы получаем содержимое файла и передаем его в функцию render_layout (предварительно распарисв файл с помощью функции json_decode):
$layout = json_decode(file_get_contents('layout.json'));
render_layout($layout);

Вот содержимое render_layout:
<?php
function render_layout($layout){
    // это объект, который занимается формированием лэйоутов
    // и получением необходимого контента его код я показать не могу
	global $layouts_manager;
	foreach ($layout['body_structure'] as $row_key => $columns) :
	$global_width = ((count($columns) % 2) == 0) ? 8 : 9;
	?>
		<div class="row">
  			<div class="span<?php echo $global_width; ?>">
  				<div class="row">
		  			<?php foreach ($columns as $column_key => $column_val) : 
		  				$width = round($global_width / count($columns));
		  			?>
		  				<div class="span<?php echo $width; ?>"><br>
		  					<?php foreach ($column_val['content_elements'] as $element_key => $element) : ?>
		  						<div class="row">
			  						<div class="span<?php echo $width; ?>">
			  							<?php 
			  								$contet = $layouts_manager->get_element_content(
			  									$element['content_type'], 
			  									$element['content_source']
			  								); 
			  							?>
			  							<?php echo $contet; ?>
									</div>	
								</div>
							<?php endforeach; ?>
		  				</div>				
		  			<?php endforeach; ?>
	  			</div><br>
  			</div>
		</div>
	<?php endforeach; ?>

	<?php
}
?>

В этой функции мы и применяем сетку Twitter Bootstrap. Для использования Twitter Bootstrap в WordPress, его нужно сначала подключить:
// подключение bootstrap для фронтенда (в админке WordPress он не нужен)
if(!is_admin()){
	wp_enqueue_script( 'bootstrap_js', 'bootstrap/js/bootstrap.js' );
	wp_enqueue_style( 'bootstrap_css', 'bootstrap/css/bootstrap.css' );
}

Добавлено: 20 Мая 2018 21:10:13 Добавил: Андрей Ковальчук

Подключение собственных компонентов в WordPress

Разрабатывая проект на WordPress я однажды столкнулся с потребностью подключать собсвенные расширения (некое подобие плагинов WordPress, но со своими плюшкми). WordPress использует некий header, для описания плагинов и тем. Выглядит он так:

/**
 * @package Hello_Dolly
 * @version 1.6
 */
/*
Plugin Name: Hello Dolly
Plugin URI: http://wordpress.org/extend/plugins/hello-dolly/
Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
Author: Matt Mullenweg
Version: 1.6
Author URI: http://ma.tt/
*/

Я решил сделать что-то подобное, вот мой заголовок:
/*
    Extension Name: 
    Extension URI:
    Version: 0.1
    Description: 
    Author:
    Author URI:
    Text Domain:
    Domain Path:
    Network:
    Site Wide Only:
*/

Для того чтоб распарсить это была написана функция:
function get_extension_data( $ext_file ) {

	$default_headers = array(
		'Name' => 'Extension Name',
		'ExtensionURI' => 'Extension URI',
		'Version' => 'Version',
		'Description' => 'Description',
		'Author' => 'Author',
		'AuthorURI' => 'Author URI',
		'TextDomain' => 'Text Domain',
		'DomainPath' => 'Domain Path',
		'Network' => 'Network',
		'_sitewide' => 'Site Wide Only',
		'DepsExts' => 'Dependence Extensions',
	);
	$ext_data = array();
	$ext_data = get_file_data( $ext_file, $default_headers );

	// Site Wide Only is the old header for Network
	if ( !$ext_data['Network'] && $ext_data['_sitewide'] ) {
		_deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The <code>%1$s</code> plugin header is deprecated. Use <code>%2$s</code> instead.' ), 'Site Wide Only: true', 'Network: true' ) );
		$ext_data['Network'] = $ext_data['_sitewide'];
	}
	$ext_data['Network'] = ( 'true' == strtolower( $ext_data['Network'] ) );
	unset( $ext_data['_sitewide'] );
	
	$ext_data['Title'] = $ext_data['Name'];
	$ext_data['AuthorName'] = $ext_data['Author'];

	if ( $ext_data['DepsExts'] ) {
		$ext_data['DepsExts'] = explode( ',', $ext_data['DepsExts'] );
	}

	return $ext_data;

}

Она принимает путья к файлу расширения, в котором задан header и средствами WordPress парсит его, возвращая масив с данными. Парсингом занимается функция WordPress - get_file_data, которая принимает файл и элементы для поиска в header’e. Вот сама функции:
function get_file_data( $file, $default_headers, $context = '' ) {
	// We don't need to write to the file, so just open for reading.
	$fp = fopen( $file, 'r' );

	// Pull only the first 8kiB of the file in.
	$file_data = fread( $fp, 8192 );

	// PHP will close file handle, but we are good citizens.
	fclose( $fp );

	// Make sure we catch CR-only line endings.
	$file_data = str_replace( "\r", "\n", $file_data );

	if ( $context && $extra_headers = apply_filters( "extra_{$context}_headers", array() ) ) {
		$extra_headers = array_combine( $extra_headers, $extra_headers ); // keys equal values
		$all_headers = array_merge( $extra_headers, (array) $default_headers );
	} else {
		$all_headers = $default_headers;
	}

	foreach ( $all_headers as $field => $regex ) {
		if ( preg_match( '/^[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] )
			$all_headers[ $field ] = _cleanup_header_comment( $match[1] );
		else
			$all_headers[ $field ] = '';
	}

	return $all_headers;
}

Полученые данные мне нужны для отображения информации о расширении в списке моих расширений (в моем варианте есть возможность активации/деактивации моих расширений). Потом я пробегаюсь по директории с расширениями и подключаю все активированые:
$extensions_dir = 'extensions_dir_path';
// Default method, only load activated extensions
foreach ( (array) $extensions['active'] as $ext ) {
	if ( file_exists( $extensions_dir.$ext ) && $ext != '' ) {
		include_once $extensions_dir.$ext;
	}
}

Добавлено: 20 Мая 2018 20:53:10 Добавил: Андрей Ковальчук

Получение текущей категории в WordPress

При написании шаблонов для темы wordpress часто нужно получить текущую категорию. Вот как это можно сделать:

$this_cat = get_category(get_query_var('cat'),false);

Здесь мы получаем категорию с помощью функции get_category. Данная функция возвращает объект категории по её ID. Идентификатор категории мы получаем с помощью функции get_query_var(‘parametr’, false)

Добавлено: 20 Мая 2018 18:30:02 Добавил: Андрей Ковальчук

Скорость генерации страницы в WordPress

Данный сайт существует уже около года и, оказывается, это он доставлял мне и моему хостеру скромный геммор.

Дело в том, что последний год по статистике нагрузки на сервер наблюдаю некоторую неоднородную картину. Большинство сайтов, которые я держу на сервере — самописные, на собственной CMS и превышение нагрузки я связывал с большим трафиком на одном из своих проектов… Каково было моё разочарование!!! А педалит-то, оказывается, этот блог, суко! Релиз был установлен из набора хостера, поэтому, скорее всего, какая-то бяка сидит в коде движка… Генерация страницы 0.3 … 0.5 секунд! Это просто охренеть можно! В то время как мои другие сайты на собственной CMS — 0.01 … 0.05 секунд(с учётом всех запросов к БД).

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

Где-то читал (не помню этого аматара), что якобы вордпресс — это типа «самый пиздатый быстрый движок»… Да уж… Набить бы ему рожу…

Добавлено: 20 Мая 2018 07:36:10 Добавил: Андрей Ковальчук

Создание кастомной таксономии в WordPress

Очень часто при разработке под WordPress приходится регистрировать собственные таксономии. Вот очнеь простой спосб добавить новую таксономию WordPress:

/**
 * Add custom taxonomies
 *
 * Additional custom taxonomies can be defined here
 * http://codex.wordpress.org/Function_Reference/register_taxonomy
 */
function add_custom_taxonomies() {
	// Add new "Locations" taxonomy to Posts
	register_taxonomy('location', 'post', array(
		// Hierarchical taxonomy (like categories)
		'hierarchical' => true,
		// This array of options controls the labels displayed in the WordPress Admin UI
		'labels' => array(
			'name' => _x( 'Locations', 'taxonomy general name' ),
			'singular_name' => _x( 'Location', 'taxonomy singular name' ),
			'search_items' =>  __( 'Search Locations' ),
			'all_items' => __( 'All Locations' ),
			'parent_item' => __( 'Parent Location' ),
			'parent_item_colon' => __( 'Parent Location:' ),
			'edit_item' => __( 'Edit Location' ),
			'update_item' => __( 'Update Location' ),
			'add_new_item' => __( 'Add New Location' ),
			'new_item_name' => __( 'New Location Name' ),
			'menu_name' => __( 'Locations' ),
		),
		// Control the slugs used for this taxonomy
		'rewrite' => array(
			'slug' => 'locations', // This controls the base slug that will display before each term
			'with_front' => false, // Don't display the category base before "/locations/"
			'hierarchical' => true // This will allow URL's like "/locations/boston/cambridge/"
		),
	));
}
add_action( 'init', 'add_custom_taxonomies', 0 );

Добавлено: 20 Мая 2018 07:32:26 Добавил: Андрей Ковальчук

Использование placeholder-ов для Contact Form 7.

На момент написания этой статьи популярный плагин WordPress для создания форм Contact Form 7 не предусматривает использование «плэйсхолдеров». Возможно, эта возможность появиться позднее. Сейчас мы можем реализовать это через добавление небольшого jQuery-кода в нашу тему.

Прежде всего, необходимо добавить ключевое слово watermark для тех текстовых полей, где вы хотите использовать placeholder. Например:

[text* email id:email class:myclass watermark "Email"]

После этого остается добавить код jQuery в любое место вашего шаблона (можно в хэдер или футер):
<script>
jQuery(document).ready(function() {
    jQuery("form p span input").each(function() {
        jQuery(this).attr("placeholder", jQuery(this).attr("title"));       
    });  
 
    jQuery("form p span textarea").each(function() {
        jQuery(this).attr("placeholder", jQuery(this).text());
        jQuery(this).text("")   
    });
});
</script>

Если вы используете только ‘watermark’, то форма будет иметь аналогичную функциональность, но дефолтное значение будет исчезать при вставке курсора в поле, а не в момент начала печатания чего-то. В принципе, этого вполне достаточно.

Добавлено: 19 Мая 2018 21:34:03 Добавил: Андрей Ковальчук

Как запретить отображение содержимого директорий WordPress.

По умолчанию, если ваш веб-сервер не находит индексный файл (например, index.php или index.html), то он автоматически отображает страницу со структурой и содержимым данной директории. Разумеется, это не безопасно и такие «дыры» необходимо прикрывать.

Существует несколько способов избежать ситуации, когда просматривается содержимое ваших директорий. Первый способ – рутинный: необходимо поместить во все ваши директории пустой файл index.html. Это работает, но здесь придется потратить прилично собственного времени, ведь директорий может быть достаточно много.

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

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

Кстати, на некоторых серверах файлы, начинающие с точки могут быть «не видимы» для обзора. Убедитесь, что в вашем FTP-клиенте включена опция просмотра скрытых файлов.

Для удобства можно скопировать .htaccess на ваш локальный ПК и открыть его с помощью текстового редактора.
Добавьте одну строчку в самый конец файла:

Options -Indexes

Теперь сохраните файл и закачайте его обратно на сервер.

Данная команда выключает отображение содержимого директорий.

Добавлено: 19 Мая 2018 21:33:13 Добавил: Андрей Ковальчук

Как редактировать шаблон wordpress




Ответить на вопрос «как редактировать шаблон WordPress» с одной стороны и просто, но с другой – не так легко объяснить, что именно нужно изменить, так как задачи могут быть совершенно различными.

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

Header.php – файл, в котором находится весь html-код, заключенный между тегами <head> и </head>. Кроме того, сюда также входит начальная видимая часть любой страницы – «шапка». Обычно она включает в себя вывод верхнего меню.

index.php – самый важный файл, отвечающий, в частности, за вывод главной страницы.
style.css – файл стилей. Здесь можно подкорректировать цвета, отступы и другие свойства элементов на странице.
comments.php – файл, отвечающий за вывод комментариев.
single.php – отвечает за вывод отдельного поста.
page.php – шаблон страницы.
category.php – определяет отображение категорий
archive.php – отображение архивных страниц
search.php – страница результатов поиска.
404.php – отображаемая страница, если запрошенный URL не найден.
function.php – содержит функции темы.

Вносить изменения в любой из этих файлов можно через админ-панель. Для этого нужно зайти в «Внешний вид – > Редактор». Настоятельно рекомендую перед тем как вносить какие-либо изменения в тот или иной файл делать его копию.

Добавлено: 19 Мая 2018 21:32:26 Добавил: Андрей Ковальчук

Стандартный цикл wordpress

Выводим записи, используя стандартный цикл wordpress:

<?php
//запрашиваем все посты из категории (напр., 37)
$posts=query_posts("cat=37&post_per_page=-1");
 
while ( have_posts() ) : the_post();
//заголовок записи 
the_title();
//содержимое поста
the_content();
//окончание цикла
endwhile;
?>

Вывод анонса записей:
the_excerpt();

По умолчанию выводится 55 слов, изменяем количество, добавляя свой код в файл с функциями:
function custom_excerpt_length( $length ) {
	return 250;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

250 – количество слов.

Ссылка на пост:
<?php the_permalink(); ?>

Добавлено: 19 Мая 2018 21:31:44 Добавил: Андрей Ковальчук

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

Использовать Ajax в WordPress достаточно просто. Если Вы знакомы с WordPress, то должны знать, что такое хуки.

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

Так вот, в WordPress для использования Ajax есть хуки: wp_ajax_(action) и wp_ajax_nopriv_(action). Отличаются они тем, что wp_ajax_nopriv_(action) доступен незалогиненым пользователям, а к экшену wp_ajax_(action) могут отправлять запросы только авторизированые пользователи.

Вот пример обычного ajax-запроса:

// Регестрируем функцию на ajax-запрос к экшену "test"
// данная функция будет доступна для ajax-запросов как из фронтенда, так и с админки
function ajax_request(){
   echo $_REQUEST['test'];
   die();
}
add_action('wp_ajax_test', 'ajax_request');
add_action('wp_ajax_nopriv_test', 'ajax_request');
$.ajax({
  type: "POST",
  data: {
     action: "test" // сюда передаем action
     test: "TEST!!!!",
  }
  url: ajaxurl,
}).done(function(responce){
   alert(responce);
});

Вот собственно и все) Как видите никаких сложностей при работе с Ajax в WordPress не возникает…

Добавлено: 18 Мая 2018 06:45:01 Добавил: Андрей Ковальчук

Создание кастомного типа постов в WordPress

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

// Register Custom Post Type
function custom_post_type() {
	$labels = array(
		'name'                => _x( 'Products', 'Post Type General Name', 'text_domain' ),
		'singular_name'       => _x( 'Product', 'Post Type Singular Name', 'text_domain' ),
		'menu_name'           => __( 'Product', 'text_domain' ),
		'parent_item_colon'   => __( 'Parent Product:', 'text_domain' ),
		'all_items'           => __( 'All Products', 'text_domain' ),
		'view_item'           => __( 'View Product', 'text_domain' ),
		'add_new_item'        => __( 'Add New Product', 'text_domain' ),
		'add_new'             => __( 'New Product', 'text_domain' ),
		'edit_item'           => __( 'Edit Product', 'text_domain' ),
		'update_item'         => __( 'Update Product', 'text_domain' ),
		'search_items'        => __( 'Search products', 'text_domain' ),
		'not_found'           => __( 'No products found', 'text_domain' ),
		'not_found_in_trash'  => __( 'No products found in Trash', 'text_domain' ),
	);

	$args = array(
		'label'               => __( 'product', 'text_domain' ),
		'description'         => __( 'Product information pages', 'text_domain' ),
		'labels'              => $labels,
		'supports'            => array( ),
		'taxonomies'          => array( 'category', 'post_tag' ),
		'hierarchical'        => false,
		'public'              => true,
		'show_ui'             => true,
		'show_in_menu'        => true,
		'show_in_nav_menus'   => true,
		'show_in_admin_bar'   => true,
		'menu_position'       => 5,
		'menu_icon'           => '',
		'can_export'          => true,
		'has_archive'         => true,
		'exclude_from_search' => false,
		'publicly_queryable'  => true,
		'capability_type'     => 'page',
	);

	register_post_type( 'product', $args );
}

// Hook into the 'init' action
add_action( 'init', 'custom_post_type', 0 );

Добавлено: 17 Мая 2018 19:07:33 Добавил: Андрей Ковальчук