限制 Wordpress 中现有和新的永久链接 slugs 的大小以进行 SEO

2024-03-21

我在 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/ https://permalinkmanager.pro/docs/filters-hooks/how-to-limit-the-number-of-words-in-wordpress-permalinks/

如何使用它将 WordPress slug 大小限制为 5 个单词?


首先,请注意是否值得这样做:

影响 SEO 的因素实际上有数百个。您不需要实施所有这些,而且许多总体上不会产生很大的影响。在我看来,这样做很可能不会产生任何显着的效果,而且只会让事情变得更加困难。

更重要的是,对SEO有影响slug 应包含您的关键字,如果您以编程方式更改它们,则有无法确保 slug 包含关键字,所以你甚至可能弊大于利。

仅供参考,几个版本前,WP 被更改为对 slugs 实施此限制,然后很快又改回来。这对我来说意味着它可能不是很有用或不太实用。

但是,如果您仍然想这样做:

限制新段中的单词

你问题中的代码来自这篇文章,对吗?:如何限制 WordPress 永久链接或 slug 中的字数? https://permalinkmanager.pro/docs/filters-hooks/how-to-limit-the-number-of-words-in-wordpress-permalinks/

您使用的第一个示例是与他们的插件一起使用的。下一个示例(包含在下面)将在没有插件的情况下在 WordPress 中运行。这可以添加到您的functions.php中。

更新:我已将代码合并到自动删除 URL 中的短词 https://www.isitwp.com/better-seo-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);

请注意,这仅适用于newslugs,您仍然需要重新生成旧的 slugs,或者编写代码来遍历现有的 slugs 来更新它们。

更新现有的 slugs

您可以将此函数添加到您的functions.php中以获取所有slug,调用上面的函数以生成新的slug,然后在数据库中更新它:

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,您只需按需调用此函数一次,而不是自动调用(否则每次加载 function.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>";
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

限制 Wordpress 中现有和新的永久链接 slugs 的大小以进行 SEO 的相关文章

  • 如何在 Python 中包含 PHP 脚本?

    我有一个 PHP 脚本 news generator php 当我包含它时 它会抓取一堆新闻项并打印它们 现在 我在我的网站 CGI 中使用 Python 当我使用 PHP 时 我在 新闻 页面上使用了这样的内容 为了简单起见 我删掉了这个
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p
  • PHP - 获取base64图像字符串解码并保存为jpg(生成空图像)

    嗨 我实际上是通过 ajax 发送一个 base64 图像字符串到一个 php 脚本 该脚本只是解码字符串并将内容保存为 jpg 文件 但结果是一张空图像 这怎么可能 PHP脚本 uploadedPhotos array photo 1 p
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 使用 php 在多维数组中按键排序[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中对多维数组进行排序 https stackoverflow com questions 2059255 sorting multidimensional array in php 如何在
  • 如何在类似 MVC 的页面中加载基于漂亮 URL 的类?

    我想请教一些关于如何解决这个问题的提示 我正在尝试构建自己的 MVC 网站 我了解了 URL 的基础知识 http example com blog cosplay cosplayer expo today 博客 gt 控制器cosplay
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • postgreSql 中特定时间后表更新

    我已经在 postgres 中创建了表 现在我想在特定时间 例如 1 小时 后更新一行 我看到很多问题 例如 https dba stackexchange com questions 56424 column auto updated a
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Joomla 页面中的自定义 php 代码

    我正在尝试将 Joomla 1 5 9 页面中的表源从页面中的硬编码 html 更改为从 SQL 数据库获取信息 执行此操作的正确方法是什么 创建一个新的模型或组件并以某种方式在页面中使用它 我找到了这些 http docs joomla
  • Sonata DateTimePickerType 类默认日期显示错误的日期时间格式

    我陷入困境 我不知道如何使用 sonata DateTimePickerType 类正确设置默认日期和时间 我尝试了不同的方法 但到目前为止 没有一种方法没有帮助 在下面的截图中 help 键显示正确的日期和时间 但是当我使用 dp 默认日
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • 保存多对多关系,同步/附加不存在?

    我有以下两个多对多关系的模型 use Illuminate Database Eloquent Model class Permission extends Model The database table used by the mode
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中

随机推荐