Поддержка Проблемы и решения Доп. описание в категориях постов

  • Здравствуйте. Как можно сделать дополнительное описание в категориях постов, одно (то что стандартное) должно быть как описание категории, а второе СЕО (то есть как мета описание).

    Так вот реализовано на одном из проектов https://gyazo.com/f125f63d49b80d63d2b604dcdfdb24fe

    Но это, я так понимаю реализовано в теме конкретной, а куда подсмотреть чтобы сделать так же?

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Модератор Yuri

    (@yube)

    Проще всего поставить какой-нибудь SEO-плагин, например, Yoast. Но можно (в случае острой плагинофобии) создать (код в functions.php Темы) метаданные для рубрик и обеспечить их вывод.

    Проще всего поставить какой-нибудь SEO-плагин, например, Yoast. Но можно (в случае острой плагинофобии) создать (код в functions.php Темы) метаданные для рубрик и обеспечить их вывод.

    Думал про установку плагина, но уже стоит All in One Seo, не хочется все менять и перенастраивать.

    Код нашел из проекта в котором реализовано данные поля в файле functions.php

    add_action('init', 'register_additional_term_fields');
    function register_additional_term_fields(){ 
    	new trueTaxonomyMetaBox( array(
    		'id'       => 'txseo', // id играет роль префикса названий полей
    		'taxonomy' => array('category','post_tag'), // названия таксономий, для которых нужно добавить ниже перечисленные поля
    		'args'     => array(
    			array(
    				'id'    => 'seo_title', // атрибуты name и id без префикса, получится "txseo_seo_title"
    				'title' => 'SEO Заголовок',
    				'type'  => 'text',
    				'desc'  => 'Укажите альтернативное название термина для SEO.',
    				'std'   => '', // по умолчанию
    			),
    			array(
    				'id'    => 'seo_description',
    				'title' => 'SEO Описание',
    				'type'  => 'text',
    				'desc'  => 'meta тег description.',
    				'std'   => '', // по умолчанию
    			)
    		)
    	) );
    }
    add_action('wp_head', 'add_taxseo_head_meta_fields');
    function add_taxseo_head_meta_fields(){
    	if( ! is_tax() && ! is_category() && ! is_tag() ) return; // выходим если не таксы
    
    	$term = get_queried_object();
    
    	echo '<meta name="description" content="'. get_metadata('term', $term->term_id, 'txseo_seo_description', 1 ) .'">'. "\n";
    }

    Но как его прикрутить к новой теме, на новом проекте не понимаю, пробовал просто вставить код, но это ничего не помогло, да и плохой это вариант, а куда именно вставить и какие манипуляции после этого провести надо не понимаю совсем. Там еще и нужно будет что-то еще сделать, кроме вставки кода

    уже стоит All in One Seo

    что мешает в нем это настроить?

    Модератор Yuri

    (@yube)

    но уже стоит All in One Seo

    Разве он не позволяет редактировать meta description и title?

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

    Разве он не позволяет редактировать meta description и title?

    он берет meta description из описания таксономии.
    а описание и description все-таки разные вещи.

    он берет meta description из описания таксономии.
    а описание и description все-таки разные вещи.

    Вот. У меня сейчас, то описание что по умолчанию, выводится как мета.

    Модератор Yuri

    (@yube)

    он берет meta description из описания таксономии.

    Фе. Выходит, Ёст таки лучше 🙂

    Фе. Выходит, Ёст таки лучше 🙂

    meta description платная фигня для AiOSP.
    ёст, к сожалению, гораздо тормознее.

    я бы вообще предпочел плагин только с title и meta description — и больше ничего. эти комбайны раздражают.

    Так а как добавить тот код в functions.php чтобы добавились мета описания и тайтл, а стандартные были как просто описание и название?

    Модератор Yuri

    (@yube)

    Первая половина кода, приведенного выше, которая добавляет поля, должна работать. А вот вторая вряд ли будет работать, ибо, судя по всему, не учитывает, что СЕО-плагин может переделать всё по-своему.

    Если поля появились и введенные значения сохраняются, но не выводится на странице рубрики, надо разбираться с хуками фильтров AiOSP, если они там есть.

    add_action('init', 'register_additional_term_fields');
    function register_additional_term_fields(){ 
    	new trueTaxonomyMetaBox( array(
    		'id'       => 'txseo', // id играет роль префикса названий полей
    		'taxonomy' => array('category','post_tag'), // названия таксономий, для которых нужно добавить ниже перечисленные поля
    		'args'     => array(
    			array(
    				'id'    => 'seo_title', // атрибуты name и id без префикса, получится "txseo_seo_title"
    				'title' => 'SEO Заголовок',
    				'type'  => 'text',
    				'desc'  => 'Укажите альтернативное название термина для SEO.',
    				'std'   => '', // по умолчанию
    			),
    			array(
    				'id'    => 'seo_description',
    				'title' => 'SEO Описание',
    				'type'  => 'text',
    				'desc'  => 'meta тег description.',
    				'std'   => '', // по умолчанию
    			)
    		)
    	) );
    }

    после добавления этого кода появляется 500 ошибка

    Модератор Yuri

    (@yube)

    Наверно, потому что код не полный. Где-то должен быть определен класс trueTaxonomyMetaBox.

    	class trueTaxonomyMetaBox {
    	private $opt;
    	private $prefix;
    
    	function __construct( $option ) {
    		$this->opt    = (object) $option;
    		$this->prefix = $this->opt->id .'_'; // префикс настроек
    
    		foreach( $this->opt->taxonomy as $taxonomy ){
    			add_action( $taxonomy . '_edit_form_fields', array( &$this, 'fill'), 10, 2 ); // хук добавления полей
    		}
    
    		// установим таблицу в $wpdb, если её нет
    		global $wpdb;
    		if( ! isset( $wpdb->termmeta ) ) $wpdb->termmeta = $wpdb->prefix .'termmeta';
    
    		add_action('edit_term', array( &$this, 'save'), 10, 1 ); // хук сохранения значений полей
    	}
    	
    	function fill( $term, $taxonomy ){
    
    		foreach( $this->opt->args as $param ){
    			$def   = array('id'=>'', 'title'=>'', 'type'=>'', 'desc'=>'', 'std'=>'', 'args'=>array() );
    			$param = (object) array_merge( $def, $param );
    
    			$meta_key   = $this->prefix . $param->id;
    			$meta_value = get_metadata('term', $term->term_id, $meta_key, true ) ?: $param->std;
    
    			echo '<tr class ="form-field">';
    				echo '<th scope="row"><label for="'. $meta_key .'">'. $param->title .'</label></th>';
    				echo '<td>';
    
    				// select
    		if( $param->type == 'wp_editor' ){
    		  wp_editor( $meta_value, $meta_key, array(
    			'wpautop' => 1,
    			'media_buttons' => false,
    			'textarea_name' => $meta_key, //нужно указывать!
    			'textarea_rows' => 10,
    			//'tabindex'      => null,
    			//'editor_css'    => '',
    			//'editor_class'  => '',
    			'teeny'         => 0,
    			'dfw'           => 0,
    			'tinymce'       => 1,
    			'quicktags'     => 1,
    			//'drag_drop_upload' => false
    		  ) );
    		}
    		// select
    				elseif( $param->type == 'select' ){
    					echo '<select name="'. $meta_key .'" id="'. $meta_key .'">
    							<option value="">...</option>';
    
    							foreach( $param->args as $val => $name ){
    								echo '<option value="'. $val .'" '. selected( $meta_value, $val, 0 ) .'>'. $name .'</option>';
    							}
    					echo '</select>';
    					if( $param->desc ) echo '<p class="description">' . $param->desc . '</p>';
    				}
    				// checkbox
    				elseif( $param->type == 'checkbox' ){
    					echo '
    						<label>
    							<input type="hidden" name="'. $meta_key .'" value="">
    							<input name="'. $meta_key .'" type="'. $param->type .'" id="'. $meta_key .'" '. checked( $meta_value, 'on', 0) .'>
    							'. $param->desc .'
    						</label>
    					';
    				}
    				// textarea
    				elseif( $param->type == 'textarea' ){
    					echo '<textarea name="'. $meta_key .'" type="'. $param->type .'" id="'. $meta_key .'" value="'. $meta_value .'" class="large-text">'. esc_html( $meta_value ) .'</textarea>';                    
    					if( $param->desc ) echo '<p class="description">' . $param->desc . '</p>';
    				}
    				// text
    				else{
    					echo '<input name="'. $meta_key .'" type="'. $param->type .'" id="'. $meta_key .'" value="'. $meta_value .'" class="regular-text">';
    
    					if( $param->desc ) echo '<p class="description">' . $param->desc . '</p>';
    				}
    				echo '</td>';
    			echo '</tr>';         
    		}
    
    	}
    
    	function save( $term_id ){
    		foreach( $this->opt->args as $field ){
    			$meta_key = $this->prefix . $field['id'];
    			if( ! isset($_POST[ $meta_key ]) ) continue;
    
    			if( $meta_value = trim($_POST[ $meta_key ]) ){
    				update_metadata('term', $term_id, $meta_key, $meta_value, '');
    			}
    			else {
    				delete_metadata('term', $term_id, $meta_key, '', false );
    			}
    		}
    	}
    
    }
    add_action('init', 'register_additional_term_fields');
    function register_additional_term_fields(){ 
    	new trueTaxonomyMetaBox( array(
    		'id'       => 'txseo', // id играет роль префикса названий полей
    		'taxonomy' => array('category','post_tag'), // названия таксономий, для которых нужно добавить ниже перечисленные поля
    		'args'     => array(
    			array(
    				'id'    => 'seo_title', // атрибуты name и id без префикса, получится "txseo_seo_title"
    				'title' => 'SEO Заголовок',
    				'type'  => 'text',
    				'desc'  => 'Укажите альтернативное название термина для SEO.',
    				'std'   => '', // по умолчанию
    			),
    			array(
    				'id'    => 'seo_description',
    				'title' => 'SEO Описание',
    				'type'  => 'text',
    				'desc'  => 'meta тег description.',
    				'std'   => '', // по умолчанию
    			)
    		)
    	) );
    }
    add_action('wp_head', 'add_taxseo_head_meta_fields');
    function add_taxseo_head_meta_fields(){
    	if( ! is_tax() && ! is_category() && ! is_tag() ) return; // выходим если не таксы
    
    	$term = get_queried_object();
    
    	echo '<meta name="description" content="'. get_metadata('term', $term->term_id, 'txseo_seo_description', 1 ) .'">'. "\n";
    }
    
    //apply_filters( 'wp_title', $title, $sep, $seplocation );
    add_filter('wp_title', 'add_taxseo_wp_title', 20, 3);
    function add_taxseo_wp_title( $title, $sep, $seplocation ){
    	if( ! is_tax() && ! is_category() && ! is_tag() ) return $title; // выходим если не таксы
    
    	$term = get_queried_object();
    	$title = get_metadata('term', $term->term_id, 'txseo_seo_title', 1 );
    
    	return esc_html( $title );
    }

    Установил этот код просто в файл functions.php

    в итоге у меня в админ панели появились два поля https://gyazo.com/705a5cc35cb5d0eb3c939edb909964cc

    А коде страницы это дело выглядит так https://gyazo.com/ea4c1b76184ca312afdfbaf343a96031

    При этом стандартные также работают https://gyazo.com/5d53a8d26a2becdf8a6e39f78629bb59

    И All in One Seo заменяет стандартное описание на мета описание. Каким образом это можно исправить?

    Не могу найти галочку в плагине чтобы отключить замену описания в All in One Seo, может кто знает как сделать это в коде?

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Тема «Доп. описание в категориях постов» закрыта для новых ответов.