Альтернатива СЕО плагинам
Здравствуйте.
Вопрос по альтернативному решению использования СЕО плагинов из поста http://wp-kama.ru/id_86/sravnenie-seo-plaginov-platinum-seo-pack-i-all-in-one-seo-pack-i-otkaz-ot-nih.html#alternativa
У меня все работает, кроме мета-тегов в категориях. В описании рубрик прописываю [description=описание] и [keywords=слово 1, слово 2 и т.д.], а при просмотре рубрики эти данные выводятся вместе с описанием в видимой части, а в header теги не выводятся вообще.
Описание в видимой части у меня выводится кодом расположенном в файле archive.php моей темы:
// Show an optional term description. $term_description = term_description(); if ( ! empty( $term_description ) ) : printf( '<div class="post-inner-content">%s</div>', $term_description ); endif;
Спасибо за помощь.
С версии 4.4. в WP элементам таксономии можно создавать метаполя и код из указанной статьи использует их, а не шорткоды.
Такие метаполя добавить очень просто и это удобнее чем шорткоды...
Чтобы добавить метаполя description и keywords к терминам используй пример из хука taxonomy-_edit_form_fields.
Далее, код из "альтернатива сео плагинам" сделает все сам...
Поля появились. Заполнил, но данные на сайте не выводит. Причем seo title, по всей видимости, как-то режет заголовок, потому что в видимой части сайта на странице выводится обычный заголовок, а тег title пустой, т.е.
.
Скинь сюда весь код плз, так не понятно...
Весь код сейчас выглядит так:
<?php $taxname = 'category'; // Поля при добавлении элемента таксономии add_action("{$taxname}_add_form_fields", 'add_new_custom_fields'); // Поля при редактировании элемента таксономии add_action("{$taxname}_edit_form_fields", 'edit_new_custom_fields'); // Сохранение при добавлении элемента таксономии add_action("create_{$taxname}", 'save_custom_taxonomy_meta'); // Сохранение при редактировании элемента таксономии add_action("edited_{$taxname}", 'save_custom_taxonomy_meta'); function edit_new_custom_fields( $term ) { ?> <tr class="form-field"> <th scope="row" valign="top"><label>Заголовок</label></th> <td> <input type="text" name="extra[title]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'title', 1 ) ) ?>"><br /> <span class="description">SEO заголовок (title)</span> </td> </tr> <tr class="form-field"> <th scope="row" valign="top"><label>Описание</label></th> <td> <input type="text" name="extra[description]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'description', 1 ) ) ?>"><br /> <span class="description">SEO описание (description)</span> </td> </tr> <tr class="form-field"> <th scope="row" valign="top"><label>Ключевые слова</label></th> <td> <input type="text" name="extra[keywords]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'keywords', 1 ) ) ?>"><br /> <span class="keywords">SEO ключевые слова (keywords)</span> </td> </tr> <?php } function add_new_custom_fields( $taxonomy_slug ){ ?> <div class="form-field"> <label for="tag-title">Заголовок</label> <input name="extra[title]" id="tag-title" type="text" value="" /> <p>SEO заголовок (title)</p> </div> <div class="form-field"> <label for="tag-description">Описание</label> <input name="extra[description]" id="tag-description" type="text" value="" /> <p>SEO описание (description)</p> </div> <div class="form-field"> <label for="tag-keywords">Ключевые слова</label> <input name="extra[keywords]" id="tag-keywords" type="text" value="" /> <p>SEO ключевые слова (keywords)</p> </div> <?php } function save_custom_taxonomy_meta( $term_id ) { if ( ! isset($_POST['extra']) ) return; // Все ОК! Теперь, нужно сохранить/удалить данные $extra = array_map('trim', $_POST['extra']); foreach( $extra as $key => $value ){ if( empty($value) ){ delete_term_meta( $term_id, $key ); // удаляем поле если значение пустое continue; } update_term_meta( $term_id, $key, $value ); // add_term_meta() работает автоматически } return $term_id; } // удалим стандартный вывод title remove_action( 'wp_head', '_wp_render_title_tag', 1 ); // вызов всех функций add_action( 'wp_head', 'kama_render_seo_tags', 1 ); function kama_render_seo_tags(){ //remove_theme_support( 'title-tag' ); // не обязательно echo '<title>'. kama_meta_title() .'</title>'."\n\n"; kama_meta_description('', 'Рейтинг брокеров бинарных опционов, отзывы, мнение, сигналы и стратегии торговли бинарными опционами на сайте Option-Trader.info. Торговля бинарными опционами может быть прибыльной!'); kama_meta_keywords('', 'бинарные опционы, рейтинг брокеров бинарных опционов, отзывы, сигналы, стратегии, индикаторы, новости, видео, обучение, торговля, трейдинг, iq option, olymp trade'); kama_meta_robots(); } /** * Выводит заголовок страницы <title> * * Для меток и категорий указывается в настройках, в описании: [title=Заголовок]. * Для записей, если нужно, чтобы заголовок страницы отличался от заголовка записи, * создайте произвольное поле title и впишите туда произвольный заголовок. * * @ $original_title - пустышка, чтобы нормально вызывалось через хук wp_title * @ $sep - разделитель * @ $add_blog_name - добавлять ли название блога в конец заголовка для архивов (true|false) * * version 2.5 */ function kama_meta_title( $original_title = '', $sep = " » ", $add_blog_name = false ){ global $wp_query, $post; $out = ''; $blog_name = $add_blog_name ? $sep . get_bloginfo('name') : ''; // главная if( is_front_page() ) $out = get_bloginfo('name') .' - '. get_bloginfo('description'); // таксономии elseif( is_category() || is_tag() || is_tax() ){ $term = get_queried_object(); preg_match('/\[title=(.*?)\]/i', $term->description, $match ); $title = function_exists('get_term_meta') && ($tit=get_term_meta( $term->term_id, 'title', 1 )) ? $tit : @ $match[1]; if( $title ) $out = esc_html( $match[1] ); elseif( is_tax() ) $out = single_term_title( get_taxonomy( $term->taxonomy )->labels->name . $sep, false ); else $out = single_term_title('', 0); $out .= $blog_name; } // отдельная страница elseif( is_singular() || ( is_home() && ! is_front_page() ) || ( is_page() && ! is_front_page() ) ){ $out = apply_filters('kama_meta_title_singular', null, $post ); // чтобы можно было изменять вывод if( ! $out ) $out = ( $free_title = get_post_meta($post->ID, "title", true) ) ? $free_title : single_post_title( '', false ); $comment_prefix = ( isset($wp_query->query_vars['cpage']) ) ? "Комментарии {$wp_query->query_vars['cpage']}: " : ''; $out = $comment_prefix . $out; } // архив автора elseif ( is_author() ){ $author = get_queried_object(); $out = 'Статьи автора: '. $author->display_name . $blog_name; } // архив даты elseif ( is_day() || is_month() || is_year() ){ $rus_month = array('','январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь'); $rus_month2 = array('','января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'); $year = get_query_var('year'); $monthnum = get_query_var('monthnum'); $day = get_query_var('day'); if( is_year() ) $dat = "$year год"; elseif( is_month() ) $dat = "$rus_month[$monthnum] $year года"; elseif( is_day() ) $dat = "$day $rus_month2[$monthnum] $year года"; $out = 'Архив за '. $dat . $blog_name; } // поиск elseif ( is_search() ) $out = 'Результаты поиска по запросу: '. get_query_var('s'); // 404 elseif ( is_404() ) $out = "Ошибка 404: такой страницы не существует"; // Архив типа поста elseif ( is_post_type_archive() ) $out = post_type_archive_title('', false ); // другое else { // если функция вызвана из хука wp_title if( doing_filter('wp_title') ) $out = $original_title; else $out = function_exists('wp_get_document_title') ? wp_get_document_title() : wp_title( $sep, 0, 'right'); } // номера страниц для пагинации и деления записи $page = ( $page = get_query_var('paged') ) ? $page : get_query_var('page'); if( $page ) $out .= " (страница $page)"; return $out; } /** * Выводит метатег description * * Для элементов таксономий: метаполе description или в описании такой шоткод [description = текст описания] * У постов сначала проверяется, метаполе description, или цитата, или начальная часть контента. * Цитата или контент обрезаются до указанного в $maxchar символов. * * @ $foo - пустышка, чтобы вызывалось через хук * @ $home_description - указывается описание для главной страницы сайта. * @ $maxchar - Максимальная длина описания (в символах). * * version 0.3 */ function kama_meta_description( $foo = '', $home_description = '', $maxchar = 160 ){ global $wp_query, $post; $cut = true; // обрезать до макс символов. $out = ''; if( is_front_page() ) $out = $home_description ?: get_bloginfo( 'description', 'display' ); elseif( is_singular() ){ if( $out = get_post_meta($post->ID, "description", true ) ) $cut = false; if( ! $out ) $out = $post->post_excerpt ?: $post->post_content; $out = trim( strip_tags( $out ) ); } // term elseif( is_category() || is_tag() || is_tax() ){ $desc = get_queried_object()->description; // wp 4.4 if( function_exists('get_term_meta') ){ $out = get_term_meta( $post->ID, "description", true ); $cut = false; } // wp 4.4 - else{ preg_match ('!\[description=(.*)\]!iU', $desc, $match ); $out = isset( $match[1] ) ? $match[1] : ''; } } if( $out ){ $out = str_replace( array("\n", "\r"), ' ', $out ); $out = preg_replace("@\[[^\]]+]\]@", '', $out); // удаляем шоткоды if( $cut ){ $char = mb_strlen( $out ); if( $char > $maxchar ){ $out = mb_substr( $out, 0, $maxchar ); $words = explode(' ', $out ); $maxwords = count($words) - 1; //убираем последнее слово, ибо оно в 90% случаев неполное $out = join(' ', array_slice($words, 0, $maxwords)).' ...'; } } echo '<meta name="description" content="'. esc_attr($out) .'" />'."\n"; } } /** * Генерирует метатег keywords для head части сайта * * Чтобы задать свои keywords для записи, создайте произвольное поле keywords и впишите в значения необходимые ключевые слова. * Для постов (post) ключевые слова генерируются из меток и названия категорий, если не указано произвольное поле keywords. * * Для меток, категорий и произвольных таксономий, ключевые слова указываются в описании, в шоткоде: [keywords=слово1, слово2, слово3] * * @ $foo - пустышка, чтобы нормально вызывалось через хук * @ $home_keywords: Для главной, ключевые слова указываются в первом параметре: kama_meta_keywords( 'слово1, слово2, слово3' ); * @ $def_keywords: сквозные ключевые слова - укажем и они будут прибавляться к остальным на всех страницах * * version 0.3 */ function kama_meta_keywords( $foo = '', $home_keywords = '', $def_keywords = '' ){ global $wp_query, $post; $out = ''; if ( is_front_page() ){ $out = $home_keywords; } elseif( is_singular() ){ $out = get_post_meta($post->ID, 'keywords', true); // для постов указываем ключами метки и категории, если не указаны ключи в произвольном поле if( ! $out && $post->post_type == 'post' ){ $res = wp_get_object_terms( $post->ID, array('post_tag', 'category'), array('orderby' => 'none') ); // получаем категории и метки if( $res ) foreach( $res as $tag ) $out .= ", $tag->name"; $out = ltrim($out, ', '); } } elseif ( is_category() || is_tag() || is_tax() ){ // wp 4.4 if( function_exists('get_term_meta') ){ $out = get_term_meta( $post->ID, "keywords", true ); } else{ if( $desc = $wp_query->queried_object->description ){ preg_match( '!\[keywords=([^\]]+)\]!iU', $desc, $match ); $out = isset( $match[1] ) ? $match[1] : ''; } } } if( $out && $def_keywords ) $out = $out .', '. $def_keywords; if( $out ) return print "<meta name=\"keywords\" content=\"$out\" />\n"; } /** * Метатег robots * * Чтобы задать свои атрибуты метатега robots записи, создайте произвольное поле с ключом robots * и необходимым значением, например: noindex,nofollow * * Укажите параметр $allow_types, чтобы разрешить индексацию типов страниц. * * @ $foo - пустышка, чтобы правильно работал вызов из хука wp_head * @ $allow_types - какие типы страниц нужно индексировать (через запятую): * cpage, is_category, is_tag, is_tax, is_author, is_year, is_month, is_day, is_search, is_feed, is_post_type_archive, is_paged * (можно использовать любые условные теги без префикса 'is_') * cpage - страницы комментариев * @ $robots - как закрывать индексацию: noindex,nofollow * * version 0.2 */ function kama_meta_robots( $foo = '', $allow_types = 'cpage, is_category, is_tag, is_tax, is_paged, is_post_type_archive', $close = "noindex,nofollow" ){ global $post; if( ( is_home() || is_front_page() ) && ! is_paged() ) return; if( is_singular() ) $close = get_post_meta( $post->ID, 'robots', true ); $types = explode(',', $allow_types ); $types = array_map('trim', $types ); foreach( $types as $type ){ $func = $type; if( $type == 'cpage' && false !== strpos( $_SERVER['REQUEST_URI'], '/comment-page') ) $close = false; elseif( function_exists( $func ) && $func() ) $close = false; } if( $close ) echo "<meta name=\"robots\" content=\"$close\" />\n"; }Спасибо за комменты и код. Нашел мелкие ошибки в коде. Обновил 3 функции:
kama_meta_title
kama_meta_description
kama_meta_keywords
Новый код в статье указанной выше.
Что касается "а тег title пустой" - это у тебя что-то не то с темой кажется. Что может быть - идей нет. Покажи код файла header.php.
Я попробовал твой код вставить в тему Twenty Fifteen - все работает (с учетом тех правок которые я внес только что). У таксономий выводится и описание и заголовок и ключевые слова, которые я добавил в метаполя...
Нет-нет, все отлично, заработало! Спасибо большое, очень помог.)