WordPress嵌入AJAX插入的内容

时间:2015-01-20 作者:Joel Worsham

我有一个页面正在调用其他帖子的内容(特别是自定义帖子类型),并将其插入页面。这一切都很好,但我正在失去WordPress获取youtube(和其他可嵌入链接)并自动插入嵌入视频的功能。

我试过了apply_filters( \'the_content\', $my_content );, 但我认为该过滤器甚至无法通过admin-ajax.php.

我当然已经打过电话了do_shortcode( $my_content ), 但是,以类似的方式,我可以使用什么来嵌入可嵌入的链接呢?

更新时间:

为了响应bonger的回答,我将代码更新为:

wpautop( do_shortcode( $wp_embed->run_shortcode( $my_content ) ) )

($wp\\u embed在此代码行之前已全球化)

请注意wpautop()do_shortcode() 与这个问题完全无关,但我把它们放在这里只是为了完整。此代码将youtube url输出为youtube视频的链接,但不会将视频嵌入页面中。

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

我认为解决方案非常简单:

您只是在ajax回调中缺少一行代码,即:

global $post;
我假设您正在使用:

$post = get_post( $post_id );
原因是在WP_Embed::shortcode() 方法

我的回答中有更多细节here.

SO网友:bonger

我觉得有点奇怪[embed] 必须运行它们的短代码WP_Embed::run_shortcode(), eg公司

    if ( strpos( $my_content, \'[embed]\' ) !== false ) {
        global $wp_embed;
        $my_content = $wp_embed->run_shortcode( $my_content );
    }
    $my_content = do_shortcode( $my_content );
Update: 但是,由于没有注册提供商,这将无法如您所注意到的那样(!),所以我认为最简单的方法就是打电话wp_oembed_get() 直接:

            $args = array();
            global $content_width;
            $args[\'width\'] = $content_width ? $content_width : 300;
            // Simplistic parse - look for a url on its own line.
            $lines = explode( "\\n", $my_content );
            foreach ( $lines as $i => $line ) {
                $line = trim( $line );
                if ( stripos( $line, \'http\' ) === 0 ) {
                    if ( $oembed_html = wp_oembed_get( $line, $args ) ) {
                        $lines[$i] = $oembed_html;
                    }
                }
            }
            $my_content = implode( "\\n", $lines );
您可能希望使用瞬态来避免重复调用提供者-以下是我使用的东西的一个版本:

// Wrapper around wp_oembed_get() to use transients.
function wpse175427_oembed_get( $url, $args ) {
    global $wpse175427_oembed_transient_expiration;
    if ( $wpse175427_oembed_transient_expiration ) {
        $transient_key = md5( $url . \'_\' . wpse175427_reduce_array( $args ) );
        if ( $oembed_html = get_transient( $transient_key ) ) {
            return $oembed_html;
        }
    }

    //add_filter( \'oembed_fetch_url\', \'wpse175427_oembed_fetch_url\', 10, 3 );
    //add_filter( \'oembed_result\', \'wpse175427_oembed_result\', 10, 3 );
    if ( $oembed_html = wp_oembed_get( $url, $args ) ) {
        if ( $wpse175427_oembed_transient_expiration ) {
            set_transient( $transient_key, $oembed_html, $wpse175427_oembed_transient_expiration );
        }
        return $oembed_html;
    }
    return \'\';
}

// Helper to stringify args array (for transient key).
function wpse175427_reduce_array( $arr ) {
    $ret = array();
    foreach ( $arr as $key => $val ) {
        $ret[] = \'`\' . $key  . \'`=`\' . $val . \'`\';
    }
    return implode( \',\', $ret );
}
然后在ajax回调中设置全局值,例如

            global $wpse175427_oembed_transient_expiration;
            $wpse175427_oembed_transient_expiration = DAY_IN_SECONDS;
和电话wpse175427_oembed_get() 而不是wp_oembed_get().

SO网友:Maks

尝试使用get_the_content(), 例如:

$my_content = get_the_content();
$my_content = apply_filters(\'the_content\', $my_content);

结束

相关推荐

区分admin-ajax.php的两个实例

我已经在我的profile.php 页我希望能够使用pre_get_posts 但我找不到任何方法来区分此页面和常规媒体库(upload.php).使用全局$pagenow 退货admin-ajax.php 在这两种情况下。有没有其他方法可以判断哪个页面正在加载媒体库?