WordPress как на ладони
wordpress jino

Альтернатива СЕО плагинам

Здравствуйте.

Вопрос по альтернативному решению использования СЕО плагинов из поста 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;

Спасибо за помощь.

0
Гость год назад
  • 0
    Kama4464

    С версии 4.4. в WP элементам таксономии можно создавать метаполя и код из указанной статьи использует их, а не шорткоды.

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

    Чтобы добавить метаполя description и keywords к терминам используй пример из хука taxonomy-_edit_form_fields.

    Далее, код из "альтернатива сео плагинам" сделает все сам...

    Сергей год назад

    Поля появились. Заполнил, но данные на сайте не выводит. Причем seo title, по всей видимости, как-то режет заголовок, потому что в видимой части сайта на странице выводится обычный заголовок, а тег title пустой, т.е.

    <title></title>

    .

    Kama год назад

    Скинь сюда весь код плз, так не понятно...

    Сергей год назад

    Весь код сейчас выглядит так:

    <?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";
    }
    
    Kama год назад

    Спасибо за комменты и код. Нашел мелкие ошибки в коде. Обновил 3 функции:

    kama_meta_title
    kama_meta_description
    kama_meta_keywords

    Новый код в статье указанной выше.

    Что касается "а тег title пустой" - это у тебя что-то не то с темой кажется. Что может быть - идей нет. Покажи код файла header.php.

    Я попробовал твой код вставить в тему Twenty Fifteen - все работает (с учетом тех правок которые я внес только что). У таксономий выводится и описание и заголовок и ключевые слова, которые я добавил в метаполя...

    Сергей год назад

    Нет-нет, все отлично, заработало! Спасибо большое, очень помог.)

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.