有条件地添加apt。在WordPress网站上将图形元数据打开到不同页面

时间:2012-07-06 作者:its_me

这个official Facebook plugin 在WordPress站点的不同页面(主页、帖子、页面、档案等)中添加适当的Open Graph元标记方面做得很好。

问题是它在没有我允许的情况下做了很多事情。有没有办法从插件中获取负责添加开放图元数据的函数,以便我可以将它们添加到主题的函数中。php?

1 个回复
最合适的回答,由SO网友:its_me 整理而成

这个fb-open-graph.php (最新版本的文件)位于插件的解压缩文件夹中,负责(单独)将打开的图形元数据添加到站点的标题中。

下面是我如何修改文件中的代码,使其适合添加到主题的函数中。php:

/* Facebook Open Graph Markup In Header
 * from /facebook/fb-open-graph.php file */

function fb_output_og_protocol( $property, $content ) {
    if ( empty( $property ) || empty( $content ) )
        return;

    // array of property values or structured property
    if ( is_array( $content ) ) {
        foreach( $content as $structured_property => $content_value ) {
            // handle numeric keys from regular arrays
            // account for the special structured property of url which is equivalent to the root tag and sets up the structure
            if ( ! is_string( $structured_property ) || $structured_property === \'url\' )
                fb_output_og_protocol( $property, $content_value );
            else
                fb_output_og_protocol( $property . \':\' . $structured_property, $content_value );
        }
    }
    else {
        echo "<meta property=\\"$property\\" content=\\"" . esc_attr( $content ) . "\\" />\\n";
    }
}

/* Add Open Graph protocol markup to <head> */

function fb_add_og_protocol() {
    global $post;

    $meta_tags = array(
        \'http://ogp.me/ns#locale\' => get_locale(),
        \'http://ogp.me/ns#site_name\' => get_bloginfo( \'name\' ),
        \'http://ogp.me/ns#type\' => \'website\'
    );

    if ( is_home() || is_front_page() ) {
        $meta_tags[\'http://ogp.me/ns#title\'] = get_bloginfo( \'name\' );
        $meta_tags[\'http://ogp.me/ns#description\'] = get_bloginfo( \'description\' );
    } else if ( is_single() ) {
        $post_type = get_post_type();
        $meta_tags[\'http://ogp.me/ns#type\'] = \'article\';
        $meta_tags[\'http://ogp.me/ns#url\'] = apply_filters( \'rel_canonical\', get_permalink() );
        if ( post_type_supports( $post_type, \'title\' ) )
            $meta_tags[\'http://ogp.me/ns#title\'] = get_the_title();
        if ( post_type_supports( $post_type, \'excerpt\' ) ) {
            // thanks to Angelo Mandato (http://wordpress.org/support/topic/plugin-facebook-plugin-conflicts-with-powerpress?replies=16)
            // Strip and format the wordpress way, but don\'t apply any other filters which adds junk that ends up getitng stripped back out
            if ( !post_password_required($post) ) {
                // First lets get the post excerpt (shouldn\'t have any html, but anyone can enter anything...)
                $desc_no_html = $post->post_excerpt;
                if ( !empty($excerpt_no_html) ) {
                    $desc_no_html = strip_shortcodes($desc_no_html); // Strip shortcodes first in case there is HTML inside the shortcode
                    $desc_no_html = wp_strip_all_tags($desc_no_html); // Strip all html
                    $desc_no_html = trim($desc_no_html); // Trim the final string, we may have stripped everything out of the post so this will make the value empty if that\'s the case
                }

                // Recheck if empty, may be that the strip functions above made excerpt empty, doubhtful but we want to be 100% sure.
                if( empty($desc_no_html) ) {
                    $desc_no_html = $post->post_content; // Start over, this time with the post_content
                    $desc_no_html = strip_shortcodes( $desc_no_html ); // Strip shortcodes first in case there is HTML inside the shortcode
                    $desc_no_html = str_replace(\']]>\', \']]&gt;\', $desc_no_html); // Angelo Recommendation, if for some reason ]]> happens to be in the_content, rare but We\'ve seen it happen
                    $desc_no_html = wp_strip_all_tags($desc_no_html);
                    $excerpt_length = apply_filters(\'excerpt_length\', 55);
                    $desc_no_html = wp_trim_words( $desc_no_html, $excerpt_length );
                    $desc_no_html = trim($desc_no_html); // Trim the final string, we may have stripped everything out of the post so this will make the value empty if that\'s the case
                }

                $desc_no_html = str_replace( array( "\\r\\n", "\\r", "\\n" ), \' \',$desc_no_html); // I take it Facebook doesn\'t like new lines?
                $meta_tags[\'http://ogp.me/ns#description\'] = $desc_no_html;
            }
        }

        $meta_tags[\'http://ogp.me/ns/article#published_time\'] = get_the_date(\'c\');
        $meta_tags[\'http://ogp.me/ns/article#modified_time\'] = get_the_modified_date(\'c\');

        if ( post_type_supports( $post_type, \'author\' ) && isset( $post->post_author ) )
            $meta_tags[\'http://ogp.me/ns/article#author\'] = get_author_posts_url( $post->post_author );

        // add the first category as a section. all other categories as tags
        $cat_ids = get_the_category();

        if ( ! empty( $cat_ids ) ) {
            $cat = get_category( $cat_ids[0] );

            if ( ! empty( $cat ) )
                $meta_tags[\'http://ogp.me/ns/article#section\'] = $cat->name;

            //output the rest of the categories as tags
            unset( $cat_ids[0] );

            if ( ! empty( $cat_ids ) ) {
                $meta_tags[\'http://ogp.me/ns/article#tag\'] = array();
                foreach( $cat_ids as $cat_id ) {
                    $cat = get_category( $cat_id );
                    $meta_tags[\'http://ogp.me/ns/article#tag\'][] = $cat->name;
                    unset( $cat );
                }
            }
        }

        // add tags. treat tags as lower priority than multiple categories
        $tags = get_the_tags();

        if ( $tags ) {
            if ( ! array_key_exists( \'http://ogp.me/ns/article#tag\', $meta_tags ) )
                $meta_tags[\'http://ogp.me/ns/article#tag\'] = array();

            foreach ( $tags as $tag ) {
                $meta_tags[\'http://ogp.me/ns/article#tag\'][] = $tag->name;
            }
        }

        // does current post type and the current theme support post thumbnails?
        if ( post_type_supports( $post_type, \'thumbnail\' ) && function_exists( \'has_post_thumbnail\' ) && has_post_thumbnail() ) {
            list( $post_thumbnail_url, $post_thumbnail_width, $post_thumbnail_height ) = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), \'full\' );

            if ( ! empty( $post_thumbnail_url ) ) {
                $image = array( \'url\' => $post_thumbnail_url );

                if ( ! empty( $post_thumbnail_width ) )
                    $image[\'width\'] = absint( $post_thumbnail_width );

                if ( ! empty($post_thumbnail_height) )
                    $image[\'height\'] = absint( $post_thumbnail_height );

                $meta_tags[\'http://ogp.me/ns#image\'] = array( $image );
            }
        }
    }
    else if ( is_author() && isset( $post->post_author ) ) {
        $meta_tags[\'http://ogp.me/ns#type\'] = \'profile\';
        $meta_tags[\'http://ogp.me/ns/profile#first_name\'] = get_the_author_meta( \'first_name\', $post->post_author );
        $meta_tags[\'http://ogp.me/ns/profile#last_name\'] = get_the_author_meta( \'last_name\', $post->post_author );
        if ( is_multi_author() )
            $meta_tags[\'http://ogp.me/ns/profile#username\'] = get_the_author_meta( \'login\', $post->post_author );
    }
    else if ( is_page() ) {
        $meta_tags[\'http://ogp.me/ns#type\'] = \'article\';
        $meta_tags[\'http://ogp.me/ns#title\'] = get_the_title();
        $meta_tags[\'http://ogp.me/ns#url\'] = apply_filters( \'rel_canonical\', get_permalink() );
    }

    $meta_tags[\'http://ogp.me/ns/fb#app_id\'] = \'FACEBOOK APP ID HERE\';

    $meta_tags = apply_filters( \'fb_meta_tags\', $meta_tags, $post );

    foreach ( $meta_tags as $property => $content ) {
        fb_output_og_protocol( $property, $content );
    }
}

add_action( \'wp_head\', \'fb_add_og_protocol\' );

Notes:

<使用的插件版本:1.0.1

确保首先停用原始插件本身。

更换fb_get_locale() 具有get_locale()

移除(第905行):

$excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'[...]\');
并更换(第906行):

$desc_no_html = wp_trim_words( $desc_no_html, $excerpt_length, $excerpt_more );
使用此选项:

$desc_no_html = wp_trim_words( $desc_no_html, $excerpt_length );
这修复了插件中的一个bug,该bug导致插件在og:description meta标记(see Stephen Hariss\' comment).

替换此(第151-154行):

$options = get_option( \'fb_options\' );

if ( ! empty( $options[\'app_id\'] ) )
    $meta_tags[\'http://ogp.me/ns/fb#app_id\'] = $options[\'app_id\'];
使用此选项:

$meta_tags[\'http://ogp.me/ns/fb#app_id\'] = \'FACEBOOK APP ID HERE\';
(此处将FACEBOOK应用程序ID替换为您的应用程序ID-编号)

我仍然安装了这个插件,BUT deactivated 这样我可以随时监视更新,并在必要时进行更改。

结束

相关推荐

如何指定用户从Facebook注销后要重定向到的URL?

我需要指定一个url,在用户从facebook注销后,我将使用该url,因为我需要做一些额外的清理,并且他正确地从我们的应用程序注销。为此,我需要一个url,当调用它时,它将调用我定义的函数,但我不知道应该如何做,应该使用什么操作。在Drupal中,我可以定义一个“回调菜单”,这正是我想要的,我不知道如何在wordpress中实现这一点。编辑-为了澄清更多信息,用户通过facebook connect连接到我的插件。标准$logout_url = $facebook->getLogoutUrl();