do_enclose() WordPress Function

The do_enclose() function is a built-in WordPress function that is used to process podcast and other enclosures. It is called by the Atom and RSS feed handlers.

do_enclose( string|null $content, int|WP_Post $post ) #

Check content for video and audio links to add as enclosures.


Description

Will not add enclosures that have already been added and will remove enclosures that are no longer in the post. This is called as pingbacks and trackbacks.


Top ↑

Parameters

$content

(string|null)(Required)Post content. If null, the post_content field from $post is used.

$post

(int|WP_Post)(Required)Post ID or post object.


Top ↑

Return

(void|false) Void on success, false if the post is not found.


Top ↑

Source

File: wp-includes/functions.php

880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
function do_enclose( $content, $post ) {
    global $wpdb;
 
    // @todo Tidy this code and make the debug code optional.
    include_once ABSPATH . WPINC . '/class-IXR.php';
 
    $post = get_post( $post );
    if ( ! $post ) {
        return false;
    }
 
    if ( null === $content ) {
        $content = $post->post_content;
    }
 
    $post_links = array();
 
    $pung = get_enclosed( $post->ID );
 
    $post_links_temp = wp_extract_urls( $content );
 
    foreach ( $pung as $link_test ) {
        // Link is no longer in post.
        if ( ! in_array( $link_test, $post_links_temp, true ) ) {
            $mids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $link_test ) . '%' ) );
            foreach ( $mids as $mid ) {
                delete_metadata_by_mid( 'post', $mid );
            }
        }
    }
 
    foreach ( (array) $post_links_temp as $link_test ) {
        // If we haven't pung it already.
        if ( ! in_array( $link_test, $pung, true ) ) {
            $test = parse_url( $link_test );
            if ( false === $test ) {
                continue;
            }
            if ( isset( $test['query'] ) ) {
                $post_links[] = $link_test;
            } elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) {
                $post_links[] = $link_test;
            }
        }
    }
 
    /**
     * Filters the list of enclosure links before querying the database.
     *
     * Allows for the addition and/or removal of potential enclosures to save
     * to postmeta before checking the database for existing enclosures.
     *
     * @since 4.4.0
     *
     * @param string[] $post_links An array of enclosure links.
     * @param int      $post_ID    Post ID.
     */
    $post_links = apply_filters( 'enclosure_links', $post_links, $post->ID );
 
    foreach ( (array) $post_links as $url ) {
        $url = strip_fragment_from_url( $url );
 
        if ( '' !== $url && ! $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $url ) . '%' ) ) ) {
 
            $headers = wp_get_http_headers( $url );
            if ( $headers ) {
                $len           = isset( $headers['content-length'] ) ? (int) $headers['content-length'] : 0;
                $type          = isset( $headers['content-type'] ) ? $headers['content-type'] : '';
                $allowed_types = array( 'video', 'audio' );
 
                // Check to see if we can figure out the mime type from the extension.
                $url_parts = parse_url( $url );
                if ( false !== $url_parts && ! empty( $url_parts['path'] ) ) {
                    $extension = pathinfo( $url_parts['path'], PATHINFO_EXTENSION );
                    if ( ! empty( $extension ) ) {
                        foreach ( wp_get_mime_types() as $exts => $mime ) {
                            if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {
                                $type = $mime;
                                break;
                            }
                        }
                    }
                }
 
                if ( in_array( substr( $type, 0, strpos( $type, '/' ) ), $allowed_types, true ) ) {
                    add_post_meta( $post->ID, 'enclosure', "$url\n$len\n$mime\n" );
                }
            }
        }
    }
}


Top ↑

Changelog

Changelog
VersionDescription
5.6.0The $content parameter is no longer optional, but passing null to skip it is still supported.
5.3.0The $content parameter was made optional, and the $post parameter was updated to accept a post ID or a WP_Post object.
1.5.0Introduced.

The content displayed on this page has been created in part by processing WordPress source code files which are made available under the GPLv2 (or a later version) license by the Free Software Foundation. In addition to this, the content includes user-written examples and information. All material is subject to review and curation by the WPPaste.com community.

Show More
Show More