WordPress.org

Ready to get started?Download WordPress

Forums

WordPress SEO by Yoast
SEO is vital, why trust to any breakable plugin ?? (13 posts)

  1. 1bitor2
    Member
    Posted 2 years ago #

    Hi!

    Disclaim, first:

    • I'm not criticizing Joost or any plugin developper huge and free work
    • Sorry for my not to bad but not so good english level
    • I'm not a php rudy/king/dev
    • PLEASE, this is not a troll thread. Just collaborat in any constructive way, or… do nothing
    • "Who doesn't try, have nothing."

    This is the tread/post wich give me the idea of this one:
    http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-problem-with-titles-meta?replies=18#post-3064482

    The ONLY consideration for this new thread is: how to deal safe before your favorit SEO wp tool brake?
    My personnal motivation is: I'm now ready to launch a new site, but damn, an update (1.2.5 by Yoast) just break my SEO. (see mentionned thread/post above).

    Ok, let's start the dance:
    Plugin is plugin, you trust in them but, one day, it ruin your efforts. How to safely replace it/them, when it's possible??

    The goal: natively replace all functions provided by WordPress SEO by Yoast, by hard coding to your theme.

    How? Here, collecting php snippets wich achieve this.

    The MAIN goal: Achive to have Title, Meta Desc, Meta Key, Meta Robots for Page, Post, Category, Tag, …, with the only help of Custom fields and/or conditionnal PHP and/or something more smart.

    The submain goal: Giving food to the hope than one day, WordPress team include a large amount of SEO function, natively on wordpress.

    Nice? Ok stop blabla.
    There are the firsts littles I can provide quickly, for your FUNCTION.PHP:

    Cleanup head section:

    remove_action('wp_head', 'wlwmanifest_link');
    remove_action('wp_head', 'rsd_link');
    remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0 );

    Trailing slash 1 :

    /*
    Plugin Name: Smart Trailing Slash
    Plugin URI: http://www.fastagent.de/res/download/smart-trailing-slash.zip
    Description: Gives permalinks a trailing slash, but removes it in permalinks with a filename extension, e.g. .html
    Version: 1.01
    Author: Peter Claus Lamprecht
    Author URI: http://www.fastagent.de/
    */
    
    function pcl_smart_trailingslashit($string) {
    	/* ensure, that there is one trailing slash */
    	$string = rtrim($string, '/') . '/';
    	/* if there is a filename extension like .html or .php, then remove the trailing slash */
    	if ( 0 < preg_match("#\.[^/]+/$#", $string) ) {
    		$string = rtrim($string, '/');
    	}
    	return $string;
    }
    add_filter('user_trailingslashit', 'pcl_smart_trailingslashit');

    Add trailing slash to CAT (not tested) :

    if (is_admin()) return;
    
    $permalink_structure = get_option('permalink_structure');
    if (!$permalink_structure || '/' === substr($permalink_structure, -1))
    	return;
    
    add_filter('user_trailingslashit', 'ppm_fixe_trailingslash', 10, 2);

    Another trailing slash (not tested):

    /**
     * Appends a trailing slash if it's missing in the permalink structure.
     *
     * Conditionally adds a trailing slash if the url type is not "single".
     *
     * @param string $url A URL with or without a trailing slash.
     * @param string $type The type of URL being considered (e.g. single, category, etc).
     * @return string The URL with the trailing slash fixed.
     */
    function ppm_fixe_trailingslash($url, $type)
    {
    	if ('single' === $type)
    		return $url;
    	if ('page' === $type)
    		return $url;
    
    	return trailingslashit($url);
    }

    BREADCRUMB with MICRODATA support (by http://www.seomix.fr/fil-dariane-chemin-navigation/ updated 19-04-2012):

    //***Fil d'arianne
    function myget_category_parents($id, $link = false,$separator = '/',$nicename = false,$visited = array()) {
      $chain = '';$parent = &get_category($id);
        if (is_wp_error($parent))return $parent;
        if ($nicename)$name = $parent->name;
        else $name = $parent->cat_name;
        if ($parent->parent && ($parent->parent != $parent->term_id ) && !in_array($parent->parent, $visited)) {
            $visited[] = $parent->parent;$chain .= myget_category_parents( $parent->parent, $link, $separator, $nicename, $visited );}
        if ($link) $chain .= '<span typeof="v:Breadcrumb"><a href="' . get_category_link( $parent->term_id ) . '" title="Voir tous les articles de '.$parent->cat_name.'" rel="v:url" property="v:title">'.$name.'</a></span>' . $separator;
        else $chain .= $name.$separator;
        return $chain;}
    function mybread() {
      global $wp_query;$ped=get_query_var('paged');$rendu = '<div xmlns:v="http://rdf.data-vocabulary.org/#">';
      if ( !is_home() ) {$rendu .= '<span id="breadex">Vous &ecirc;tes ici :</span> <span typeof="v:Breadcrumb"><a title="'. get_bloginfo('name') .'" id="breadh" href="'.home_url().'" rel="v:url" property="v:title">'. get_bloginfo('name') .'</a></span>';}
      elseif ( is_home() ) {$rendu .= '<span id="breadex">Vous &ecirc;tes ici :</span> <span typeof="v:Breadcrumb">Accueil de '. get_bloginfo('name') .'</span>';}
      if ( is_category() ) {
        $cat_obj = $wp_query->get_queried_object();$thisCat = $cat_obj->term_id;$thisCat = get_category($thisCat);$parentCat = get_category($thisCat->parent);
        if ($thisCat->parent != 0) $rendu .= " &raquo; ".myget_category_parents($parentCat, true, " &raquo; ", true);
        if ($thisCat->parent == 0) {$rendu .= " &raquo; ";}
        if ( $ped <= 1 ) {$rendu .= single_cat_title("", false);}
        elseif ( $ped > 1 ) {
          $rendu .= '<span typeof="v:Breadcrumb"><a href="' . get_category_link( $thisCat ) . '" title="Voir tous les articles de '.single_cat_title("", false).'" rel="v:url" property="v:title">'.single_cat_title("", false).'</a></span>';}}
      elseif ( is_author()){
        global $author;$user_info = get_userdata($author);$rendu .= " &raquo; Articles de l'auteur ".$user_info->display_name."</span>";}
      elseif ( is_tag()){
        $tag=single_tag_title("",FALSE);$rendu .= " &raquo; Articles sur le th&egrave;me <span>".$tag."</span>";}
        elseif ( is_date() ) {
            if ( is_day() ) {
                global $wp_locale;
                $rendu .= '<span typeof="v:Breadcrumb"><a href="'.get_month_link( get_query_var('year'), get_query_var('monthnum') ).'" rel="v:url" property="v:title">'.$wp_locale->get_month( get_query_var('monthnum') ).' '.get_query_var('year').'</a></span> ';
                $rendu .= " &raquo; Archives pour ".get_the_date();}
        else if ( is_month() ) {
                $rendu .= " &raquo; Archives pour ".single_month_title(' ',false);}
        else if ( is_year() ) {
                $rendu .= " &raquo; Archives pour ".get_query_var('year');}}
      elseif ( is_archive() && !is_category()){
            $posttype = get_post_type();
        $tata = get_post_type_object( $posttype );
        $var = '';
        $the_tax = get_taxonomy( get_query_var( 'taxonomy' ) );
        $titrearchive = $tata->labels->menu_name;
        if (!empty($the_tax)){$var = $the_tax->labels->name.' ';}
            if (empty($the_tax)){$var = $titrearchive;}
        $rendu .= ' &raquo; Archives sur "'.$var.'"';}
      elseif ( is_search()) {
        $rendu .= " &raquo; R&eacute;sultats de votre recherche <span>&raquo; ".get_search_query()."</span>";}
      elseif ( is_404()){
        $rendu .= " &raquo; 404 Page non trouv&eacute;e";}
      elseif ( is_single()){
        $category = get_the_category();
        $category_id = get_cat_ID( $category[0]->cat_name );
        if ($category_id != 0) {
          $rendu .= " &raquo; ".myget_category_parents($category_id,TRUE,' &raquo; ')."<span>".the_title('','',FALSE)."</span>";}
        elseif ($category_id == 0) {
            $post_type = get_post_type();
          $tata = get_post_type_object( $post_type );
            $titrearchive = $tata->labels->menu_name;
            $urlarchive = get_post_type_archive_link( $post_type );
          $rendu .= ' &raquo; <span typeof="v:Breadcrumb"><a class="breadl" href="'.$urlarchive.'" title="'.$titrearchive.'" rel="v:url" property="v:title">'.$titrearchive.'</a></span> &raquo; <span>'.the_title('','',FALSE).'</span>';}}
      elseif ( is_page()) {
        $post = $wp_query->get_queried_object();
        if ( $post->post_parent == 0 ){$rendu .= " &raquo; ".the_title('','',FALSE)."";}
        elseif ( $post->post_parent != 0 ) {
          $title = the_title('','',FALSE);$ancestors = array_reverse(get_post_ancestors($post->ID));array_push($ancestors, $post->ID);
          foreach ( $ancestors as $ancestor ){
            if( $ancestor != end($ancestors) ){$rendu .= '&raquo; <span typeof="v:Breadcrumb"><a href="'. get_permalink($ancestor) .'" rel="v:url" property="v:title">'. strip_tags( apply_filters( 'single_post_title', get_the_title( $ancestor ) ) ) .'</a></span>';}
            else {$rendu .= ' &raquo; '.strip_tags(apply_filters('single_post_title',get_the_title($ancestor))).'';}}}}
      if ( $ped >= 1 ) {$rendu .= ' (Page '.$ped.')';}
      $rendu .= '</div>';
      echo $rendu;}

    BREADCRUMB THEME HOOK:
    <?php if (function_exists('mybread')) mybread();?>

    Pleas, take your turn and feel free to share yours!

    http://wordpress.org/extend/plugins/wordpress-seo/

  2. 1bitor2
    Member
    Posted 2 years ago #

    Strip /category/ in permalink:
    Copy this plugin into your function.php. Install it by extension panel, but don't enable it. As this, you could be warmed of update.
    There are many other ways to do this, feel free to search on web to find the one wich feet your needs.
    This one work out of the box for me.

    /*
     Plugin Name: WP No Category Base
     Plugin URI: http://blinger.org/wordpress-plugins/no-category-base/
     Description: Removes '/category' from your category permalinks.
     Version: 1.1.1
     Author: iDope
     Author URI: http://efextra.com/
     */
    
    /*  Copyright 2008  Saurabh Gupta  (email : saurabh0@gmail.com)
    
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
    
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
    
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     */
    
    // Refresh rules on activation/deactivation/category changes
    register_activation_hook(__FILE__, 'no_category_base_refresh_rules');
    add_action('created_category', 'no_category_base_refresh_rules');
    add_action('edited_category', 'no_category_base_refresh_rules');
    add_action('delete_category', 'no_category_base_refresh_rules');
    function no_category_base_refresh_rules() {
    	global $wp_rewrite;
    	$wp_rewrite -> flush_rules();
    }
    
    register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
    function no_category_base_deactivate() {
    	remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
    	// We don't want to insert our custom rules again
    	no_category_base_refresh_rules();
    }
    
    // Remove category base
    add_action('init', 'no_category_base_permastruct');
    function no_category_base_permastruct() {
    	global $wp_rewrite, $wp_version;
    	if (version_compare($wp_version, '3.4', '<')) {
    		// For pre-3.4 support
    		$wp_rewrite -> extra_permastructs['category'][0] = '%category%';
    	} else {
    		$wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';
    	}
    }
    
    // Add our custom category rewrite rules
    add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
    function no_category_base_rewrite_rules($category_rewrite) {
    	//var_dump($category_rewrite); // For Debugging
    
    	$category_rewrite = array();
    	$categories = get_categories(array('hide_empty' => false));
    	foreach ($categories as $category) {
    		$category_nicename = $category -> slug;
    		if ($category -> parent == $category -> cat_ID)// recursive recursion
    			$category -> parent = 0;
    		elseif ($category -> parent != 0)
    			$category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;
    		$category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
    		$category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
    		$category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';
    	}
    	// Redirect support from Old Category Base
    	global $wp_rewrite;
    	$old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
    	$old_category_base = trim($old_category_base, '/');
    	$category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
    
    	//var_dump($category_rewrite); // For Debugging
    	return $category_rewrite;
    }
    
    // For Debugging
    //add_filter('rewrite_rules_array', 'no_category_base_rewrite_rules_array');
    //function no_category_base_rewrite_rules_array($category_rewrite) {
    //	var_dump($category_rewrite); // For Debugging
    //}
    
    // Add 'category_redirect' query variable
    add_filter('query_vars', 'no_category_base_query_vars');
    function no_category_base_query_vars($public_query_vars) {
    	$public_query_vars[] = 'category_redirect';
    	return $public_query_vars;
    }
    
    // Redirect if 'category_redirect' is set
    add_filter('request', 'no_category_base_request');
    function no_category_base_request($query_vars) {
    	//print_r($query_vars); // For Debugging
    	if (isset($query_vars['category_redirect'])) {
    		$catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');
    		status_header(301);
    		header("Location: $catlink");
    		exit();
    	}
    	return $query_vars;
    }
  3. gerardbm
    Member
    Posted 2 years ago #

    Interesting! So, waiting a code for templates of titles, metakeywords, and metadescription. Keep up the work! :)

  4. kingbt
    Member
    Posted 2 years ago #

  5. 1bitor2
    Member
    Posted 2 years ago #

    @gerardbm,
    Anyone wich have a trick can post it here. I'm not able to make them all for WordPress-seo replacement.

    @kingbt,
    thanks for the link. My first testing with it is nice.
    BTW, I'm thinking about the missing TITLE custom field, but conditionnal php tags are loosing myself…
    UPDATE: I THINK I GOT IT:

    <?php
    	// Si le détail de l'article et une page séparée, afficher le titre de l'article
    	 if(is_single() || is_page()) {
        $customField = get_post_custom_values("title");
        if (isset($customField[0])) {
            echo $customField[0];
        } else {
            wp_title( '-', true, 'right' );
        }
    	//
    	} else if(is_category()) {
    ...

    ------------------------------
    The question was:
    How to combine:

    <?php
    $title = get_post_custom_values("Title");
    if ( is_array($title) ) { ?>
    <?php echo get_post_meta($title->ID, "Title", true); ?>
    <?php }	else { ?>
    <?php the_title(); ?> | <?php bloginfo('name'); ?>
    <?php }	?>

    WITH:

    <title><?php
    	// ##### HOW TO MAKE WORKING THE ABOVE WITH THIS TITLE SECTION PLEASE ??? #####
    	 if(is_single() || is_page()) {
    		wp_title( '-', true, 'right' );
    
    	// 如果是类目页面, 显示类目表述
    	} else if(is_category()) {
    		printf('%1$s 分类的文章存档 - ', single_cat_title('', false) );
    
    	// 如果是标签页面, 显示标签表述
    	} else if(is_tag()) {
    		printf('%1$s 标签的文章存档 - ', single_tag_title('', false) );
    
    	// 如果是搜索页面, 显示搜索表述
    	} else if(is_search()) {
    		printf('%1$s 的搜索结果', wp_specialchars($s, 1));
    
    	// 如果是日期页面, 显示日期范围描述
    	} else if(is_date()) {
    		$title = '';
    		if(is_day()) {
    			$title = get_the_time('Y年n月j日');
    		} else if(is_year()) {
    			$title = get_the_time('Y年');
    		} else {
    			$title = get_the_time('Y年n月');
    		}
    		printf('%1$s 的文章存档 - ', $title);
    
    	} else if(is_404()) {
    		echo "404错误页面 - ";
     	}
    	// 添加博客名.
    	bloginfo('name');
    	// 在首页添加博客描述.
    	$site_description = get_bloginfo( 'description', 'display' );
    	if ( $site_description && ( is_home() || is_front_page() ) )
    		echo " - $site_description";
    	// Add a page number if necessary:
    	if ( $paged >= 2 || $page >= 2 )
    		echo ' - ' . sprintf( __( 'Page %s', 'hillboy' ), max( $paged, $page ) );
    	?></title>
  6. gerardbm
    Member
    Posted 2 years ago #

    @1bitor2, yes, I know that.

    My contribution: Open Graph settings.

    [ 332 lines of code moderated, that's just way too much. For that many lines of code please use pastebin.com instead. ]

  7. gerardbm
    Member
    Posted 2 years ago #

    Sorry, the code was too extensive: «332 lines of code moderated, that's just way too much. For that many lines of code please use pastebin.com instead.»

    The code: http://pastebin.com/6ktL0dch

  8. Chuck Reynolds
    Member
    Posted 2 years ago #

    Why don't you just link to my plugin instead of the pastebin?
    http://wordpress.org/extend/plugins/wp-facebook-open-graph-protocol/

    also dev on github to fork: https://github.com/chuckreynolds/WPFBOGP

  9. gerardbm
    Member
    Posted 2 years ago #

    Sorry. I just followed the initial method, then the number of lines was too much and the error suggested me to use pastebin. It was so fast! Thanks for your great plugin, it is the best for Open Graph.

  10. 1bitor2
    Member
    Posted 2 years ago #

    Thanks. Personnaly, I don't want facebook stuff…

    I'm in a way to use custom fields for adding ROBOTS META. But I need help. Im not aware with conditionnal PHP.

    BTW, here I'm (the goal is to concatenate this expressions to make them reliable, fast, flexible. Maybe some other improvement can be done. It say, for example: "if you add 'noindex-nofollow' and 'noydir-noodp' custom field, then those metas are applied".:

    <?php
    $status = get_post_meta($post->ID, 'noindex-nofollow', true);
    if ($status == '')
    { ?>
    <?php } else { ?>
    <meta name="robots" content="noindex, nofollow" />
    <?php } ?>
    
    <?php
    $status = get_post_meta($post->ID, 'index-nofollow', true);
    if ($status == '')
    { ?>
    <?php } else { ?>
    <meta name="robots" content="index, nofollow" />
    <?php } ?>
    
    <?php
    $status = get_post_meta($post->ID, 'index-follow', true);
    if ($status == '')
    { ?>
    <?php } else { ?>
    <meta name="robots" content="index, follow" />
    <?php } ?>
    
    <?php
    $status = get_post_meta($post->ID, 'noindex-follow', true);
    if ($status == '')
    { ?>
    <?php } else { ?>
    <meta name="robots" content="noindex, follow" />
    <?php } ?>
    
    <?php
    $status = get_post_meta($post->ID, 'noydir-noodp', true);
    if ($status == '')
    { ?>
    <?php } else { ?>
    <meta name="robots" content="noydir,noodp" />
    <?php } ?>
  11. gerardbm
    Member
    Posted 2 years ago #

    @1bitor2, well, in fact Open Graph is not only for Facebook. Google+ and Twitter use the Open Graph metadata. They reached agreement that standard.

    New code. How to redirect the /feed to Feedburner. Paste this code in functions.php and change the URL for your Feedburner.

    add_action('template_redirect', 'ilc_rss_redirect');
    function ilc_rss_redirect() {
        if ( is_feed() && !preg_match('/feedburner|feedvalidator/i', $_SERVER['HTTP_USER_AGENT'])){
            header('Location: http://feeds.feedburner.com/YOURFEEDBURNER');
            header('HTTP/1.1 302 Temporary Redirect');
        }
    }

    It is important for SEO to join Feedburner settings, Analyze » Configure Stats » and deactivate 'Item link clicks'. Feedburner will start publishing your actual blog URL.

  12. gerardbm
    Member
    Posted 2 years ago #

    New code for titles. Paste in functions.php. This is the only way that the admin's title worked:

    function new_title() {
            global $page, $paged, $post;
            $userid = $post->post_author;
            $user_total_post = get_usernumposts($userid);
            $user_array = get_userdata($userid);
            $userinfo = $user_array->user_login;
            if ( is_home() ) { bloginfo('name'); echo ' | '; bloginfo('description'); }
            elseif ( is_search() ) { _e('Search Results', 'source'); echo ' for &quot;'; the_search_query(); echo '&quot;'; }
            elseif ( is_author() ) { echo $userinfo;  }
            elseif ( is_page() ) { the_title();  }
            elseif ( is_single() ) { the_title(); }
            elseif ( is_category() ) { single_cat_title();  }
            elseif ( is_day() ) { _e('Archive', 'source'); echo ' | '; the_time( 'F j, Y' );  }
            elseif ( is_month() ) { _e('Archive', 'source'); echo ' | '; the_time('F Y');  }
            elseif ( is_year() ) { _e('Archive', 'source'); echo ' | '; the_time('Y');  }
            elseif ( is_tag() ) {  single_tag_title(); }
            else { wp_title(''); }
    
            // Add a page number if necessary:
            if ( $paged >= 2 || $page >= 2 )
                    echo ' | Page ' . sprintf( __('%s'), max( $paged, $page ) );
        }

    I customized some pages, but you can add more.

    Then, in header.php remove the old <title> and paste the new title:
    <title><?php new_title(); ?></title>

  13. gerardbm
    Member
    Posted 2 years ago #

    If you find a better way to get the author name, it'd be nice! :)

Topic Closed

This topic has been closed to new replies.

About this Plugin

About this Topic