-3

我们使用 WordPress,如果链接的页面有 amp 版本,我们希望将 amp 链接到 amp。我们的 amp 结构是这样的:test.de/test/amp

不幸的是,我的functions.php中的这段代码不适用于帖子内容中硬编码的链接。我必须改变什么,所以它适用于每个内部链接:

add_filter( 'post_link', function( $url, $post ) {
    static $recursing = false;
    if ( $recursing ) {
        return $url;
    }
    $recursing = true;
    if ( ! function_exists( 'post_supports_amp' ) || ! post_supports_amp( $post ) ) {
        return $url;
    }
    if ( function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ) {
        $url = amp_get_permalink( $post->ID );
    }
    $recursing = false;
    return $url;
}, 10, 2 );

目前它也适用于规范链接,这对 seo 来说真的很糟糕。如何防止这种情况?

4

3 回答 3

3

将这些函数添加到主题的“functions.php”中。

/* post link filter */
add_filter( 'post_link', 'change_amp_url', 10, 2 );

function change_amp_url( $url, $postobj ) {
    static $recursing = false;
    if ( $recursing ) {
        return $url;
    }

    $recursing = true;
    if ( function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ) {
        if ( function_exists( 'post_supports_amp' ) && post_supports_amp( $postobj ) ) {
            $url = amp_get_permalink( $postobj->ID );           
        }
    }
    $recursing = false;
    return $url;
}

/* content link filter */
add_filter( 'the_content', 'change_amp_url_content' );

function change_amp_url_content($content)
{
    $dom = new DOMDocument();
    $dom->loadHTML($content);

    $tags = $dom->getElementsByTagName('a');
    foreach ($tags as $tag) {
        $link = $tag->getAttribute('href'); // original url
        $extralink = '';
        if(stristr($link,'#')) {
            $pagelinktemp = explode("#",$link);
            $pagelink = $pagelinktemp[0];
            $extralink = '#'.$pagelinktemp[1];
        } else {
            $pagelink = $link;
        }
        if($pagelink!="") {     
            $postid = url_to_postid($pagelink);
            $postobj = get_post($postid); // getting appropriate post object            
            if($postobj) {          
                $newlink = change_amp_url( $pagelink, $postobj ); //new url
            }
            else {
                $newlink = $link;
            }
        }
        else {
            $newlink = $link;
        }
        if($link != $newlink) // change if only links are different
        {
            $content = str_replace($link, $newlink.$extralink, $content);
        }
    }
    return $content;
}

/* override canonical link */
add_filter( 'wpseo_canonical', 'amp_override_canonical' );

function amp_override_canonical($url) {
    if ( substr($url,-4)=="/amp" ) {    
        $url = substr($url,0,-4);
    }
    return $url;
}

如果存在,第一个函数将提供 AMP URL。

第二个将遍历内容中的每个 URL,如果有效,则更改为 AMP URL。

最后一个将重写通过 Yoast SEO 插件显示的规范 URL。

于 2018-08-29T13:41:23.940 回答
1

如果您想替换帖子内容中的硬编码链接,我建议您对 wordpress 使用“the_content”过滤器。

https://codex.wordpress.org/Plugin_API/Filter_Reference/the_content

add_filter( 'the_content', 'filter_function_name' )

由此,您应该能够对链接进行正则表达式匹配并将 /amp 附加到它。

伪代码示例:

function my_the_content_filter($content)
{
    if (function_exists('is_amp_endpoint') && is_amp_endpoint()) {
        $patterns = array(
            //patterns
        );
        $replacements = array(
           //replacements

        );
        $content = preg_replace($patterns, $replacements, $content);
    }

    return $content;
}

add_filter('the_content', 'my_the_content_filter');
于 2018-08-28T19:29:25.497 回答
0

我已经测试了 Outsource WordPress 提交的代码,一般来说它工作正常,但是 'amp_override_canonical 函数会覆盖删除 /amp.xml 的页面的所有 url。

我对这段代码进行了一些更改,但它们没有按我预期的那样工作。似乎在不同的上下文中调用了“wpseo_canonical”函数。

add_filter( 'wpseo_canonical', 'amp_override_canonical' );

function amp_override_canonical($url) {
    if ( substr($url,-4)=="/amp" ) {    
        $url = substr($url,0,-4);
    }
    return $url;
}
于 2018-12-06T21:30:35.400 回答