Skriven och publicerad av Karl Wångstedt den 31 Augusti 2009

Hindra att Wordpress raderar podcast-enclosures som inte är länkade

En fin funktion för podcastpublicister är att Wordpress automatiskt lägger till länkade video- och ljudfiler som enclosures i RSS:en. Men i och med version 2.8 måste filmen eller ljudfilen vara länkad i artikeltexten. Om inte så raderas länken i RSS:en också.

Det här är ett beteende som inte alltid är önskvärt. Om man inte vill ha en länk till själva mediafilen i artikeln, utan bara vill att den ska refereras via RSS i Itunes eller liknande mediaspelare så går inte det.

Om man inte ersätter de interna filtren i Wordpress vill säga.

I /wp-includes/functions.php finns funktionen för att radera icke länkade mediafiler från RSS:en. Funktionen heter do_enclose() och behöver skrivas om en aning. I /wp-includes/comment.php finns referensen till filtret i funktionen do_all_pings() som då behöver tas bort och ersättas med en ny.

Så i temats function.php behöver vi lägga till en ny version av det första filtret där den delen som kollar om mediafilen är länkad är bortkommenterad.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function KEW_do_enclose( $content, $post_ID ) {
	global $wpdb;
	include_once( ABSPATH . WPINC . '/class-IXR.php' );
 
	$log = debug_fopen( ABSPATH . 'enclosures.log', 'a' );
	$post_links = array();
	debug_fwrite( $log, 'BEGIN ' . date( 'YmdHis', time() ) . "\n" );
 
	$pung = get_enclosed( $post_ID );
 
	$ltrs = '\w';
	$gunk = '/#~:.?+=&%@!\-';
	$punc = '.:?\-';
	$any = $ltrs . $gunk . $punc;
 
	preg_match_all( "{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp );
 
	debug_fwrite( $log, 'Post contents:' );
	debug_fwrite( $log, $content . "\n" );
 
/*
	foreach ( $pung as $link_test ) {
		if ( !in_array( $link_test, $post_links_temp[0] ) ) { // link no longer in post
			$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE (%s)", $post_ID, $link_test . '%') );
		}
	}
*/
 
	foreach ( (array) $post_links_temp[0] as $link_test ) {
		if ( !in_array( $link_test, $pung ) ) { // If we haven't pung it already
			$test = parse_url( $link_test );
			if ( isset( $test['query'] ) )
				$post_links[] = $link_test;
			elseif ( $test['path'] != '/' && $test['path'] != '' )
				$post_links[] = $link_test;
		}
	}
 
	foreach ( (array) $post_links as $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, $url . '%' ) ) ) {
			if ( $headers = wp_get_http_headers( $url) ) {
				$len = (int) $headers['content-length'];
				$type = $headers['content-type'];
				$allowed_types = array( 'video', 'audio' );
				if ( in_array( substr( $type, 0, strpos( $type, "/" ) ), $allowed_types ) ) {
					$meta_value = "$url\n$len\n$type\n";
					$wpdb->insert($wpdb->postmeta, array('post_id' => $post_ID, 'meta_key' => 'enclosure', 'meta_value' => $meta_value) );
				}
			}
		}
	}
}

Efter det måste vi kopiera den refererande funktionen och ändra referensen till det nya filtret ovan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function KEW_do_all_pings() {
	global $wpdb;
 
	// Do pingbacks
	while ($ping = $wpdb->get_row("SELECT * FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_pingme' LIMIT 1")) {
		$wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE post_id = {$ping->ID} AND meta_key = '_pingme';");
		pingback($ping->post_content, $ping->ID);
	}
 
	// Do Enclosures
	while ($enclosure = $wpdb->get_row("SELECT * FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_encloseme' LIMIT 1")) {
		$wpdb->query( $wpdb->prepare("DELETE FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = '_encloseme';", $enclosure->ID) );
		KEW_do_enclose($enclosure->post_content, $enclosure->ID);
	}
 
	// Do Trackbacks
	$trackbacks = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE to_ping <> '' AND post_status = 'publish'");
	if ( is_array($trackbacks) )
		foreach ( $trackbacks as $trackback )
			do_trackbacks($trackback);
 
	//Do Update Services/Generic Pings
	generic_ping();
}

Slutligen måste vi ta bort originalfunktionen och ersätta med den nya:

1
2
remove_action('do_pings', 'do_all_pings');
add_action('do_pings', 'KEW_do_all_pings');

Hoppa högst upp på sidan

Det finns inga kommentarer. Prenumerera på kommentarer till artikeln via RSS

Lämna en kommentar

Hoppa högst upp på sidan