php 限制WordPress中用于SEO的现有和新永久链接slugs的大小

jxct1oxe  于 2023-03-21  发布在  PHP
关注(0)|答案(1)|浏览(131)

我在Google上读到一篇文章,说为了好的SEO,URL中的slug的大小最好限制在5个字以内。
当我使用WordPress时,链接会自动分配给文章标题。要用5个词重做所有链接,我必须花几个月的时间编辑博客上的所有链接。
有没有可能自动做到这一点?有一些函数或代码。我找到了这个代码,并将其添加到我的主题的函数页面,没有结果。
查看代码:

function pm_limit_slugs_length($uri) {
    $max_words = 5; // If any part of URI contains more than 5 words, the slug will be limited to first 5 words
    $new_title = '';
    $slugs = explode('/', $uri);
    
    for($i=0, $count = count($slugs); $i < $count; $i++) {
        $slug = $slugs[$i];
        $words = explode('-', $slug);
        
        $new_title .= "/";
        if(count($words) > $max_words) {
            $new_title .= implode("-", array_slice($words, 0, $max_words));
        } else {
            $new_title .= $slug;
        }
    }
    
    // Remove trailing slashes
    $new_title = trim($new_title, "/");
    
    return $new_title;
}
add_filter('permalink_manager_filter_default_post_uri', 'pm_limit_slugs_length', 99);
add_filter('permalink_manager_filter_default_term_uri', 'pm_limit_slugs_length', 99);

我在这里找到了代码:https://permalinkmanager.pro/docs/filters-hooks/how-to-limit-the-number-of-words-in-wordpress-permalinks/
我如何使用它来限制WordPress的slug大小为5个字?

z31licg0

z31licg01#

首先,说明是否值得这样做:

影响SEO的因素有100多个。你不应该把所有的都实现,而且很多都不会有很大的影响。在我看来,这样做很可能不会有任何显着的效果,它只会让事情变得更加困难。
更重要的是,要对SEO产生任何影响 *,slug应该包括您的关键字 *,如果您以编程方式更改它们,则没有办法确保slug将包括关键字,因此您甚至可能弊大于利。
顺便说一句,几个版本前,WP被改变来实现这个对鼻涕虫的限制,然后很快又变回来了。这会向我暗示它可能不是很有用或实用。
但是,如果您仍然想这样做:

限制新slugs中的单词

你的问题中的代码来自这篇文章,对吗?How to limit the number of words in WordPress permalinks or slugs?
第一个例子-你使用的-是与他们的插件一起使用。下一个例子(包括在下面)将在没有插件的情况下在Wordpress中工作。这可以添加到你的functions.php中。
更新:我已经将Automatically Remove Short Words From URL的代码合并到这个函数中,以删除少于3个字符的短单词,请参阅下面的更新函数。

<?php  
/**
 * Trim native slugs
 */
function pm_trim_native_slug($slug, $post_ID, $post_status, $post_type, $post_parent) {
    global $wpdb;

    $max_words = 5; // Limit the number of words to 5; This value can be changed.
    $words = explode('-', $slug);

    /* UPDATED CODE TO REMOVE SHORT WORDS */
    $min_word_length = 2;

    foreach ($words as $k => $word) {
        if (strlen($word) <= $min_word_length)
            unset($words[$k]);
    }
    /* END OF UPDATED CODE FOR SHORT WORDS */

    if(count($words) > $max_words) {
        $slug = implode("-", array_slice($words, 0, $max_words));

        // Make the slugs unique
        $check_sql       = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1";
        $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $slug, $post_ID));

        if($post_name_check) {
            $suffix = 2;
            do {
                $alt_post_name = _truncate_post_slug($slug, 200 - (strlen($suffix) + 1)) . "-$suffix";
                $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $alt_post_name, $post_type, $post_ID, $post_parent));
                $suffix++;
            } while ($post_name_check);
            $slug = $alt_post_name;
        }
    }

    return $slug;
}
add_filter('wp_unique_post_slug', 'pm_trim_native_slug', 99, 5);

请注意,这只对 new slug有效,您仍然需要重新生成旧的slug,或者编写代码来遍历现有的slug以更新它们。

更新现有slug

你可以将这个函数添加到你的functions.php来获取你所有的slug,调用上面的函数来生成一个新的slug,然后在DB中更新它:

function limit_all_existing_slugs(){
    // get all posts
    $posts = get_posts( array (  'numberposts' => -1 ) );
    
    foreach ( $posts as $post ){

        // create the new slug using the pm_trim_native_slug function 
        $new_slug = pm_trim_native_slug($post->post_name, 
                                        $post->ID, 
                                        $post->post_status, 
                                        $post->post_type, 
                                        $post->post_parent);

        // only do the update if the new slug is different 
        if ( $post->post_name != $new_slug ){
            wp_update_post(
                array (
                    'ID'        => $post->ID,
                    'post_name' => $new_slug
                )
            );
        }
    }
}

***请注意,上面的代码是我自己的,未经测试,所以请确保您首先在测试环境中尝试它。
如何使用此功能

要更新所有现有的slugs,您只需要按需调用此函数一次,而不是自动调用(否则它将在每次functions.php加载时更新slugs)。您可以在WP外部的外部脚本中创建一个单独的独立页面,如下所示:

<?php
    include('wp-load.php');           //Include the wp-load.php file
    define('WP_USE_THEMES', false);   //We don't need the theme files 

    echo "<p>About to update all slugs...</p>";
    limit_all_existing_slugs();
    echo "<p>...DONE</p>";
?>

相关问题