更改在 Wordpress 中生成音频嵌入简码的方式
Changing how audio embed shortcodes are generated in Wordpress
我有一个相当烦人的问题:我有一个 wordpress 网站,除其他外,它提供音频文件。 Wordpress 可以很好地过滤任何媒体插入到 post 并放入播放器,但这对于允许下载文件也不是很好。理想情况下,我想更改生成音频播放器简码的代码,并在 [/audio]
标签后添加 <a href="URL">Click here to download mp3.</a>
,但我的 PHP 几乎不存在。
我目前的方法是使用 python(我很了解)编写一个 hourly cron 脚本,它直接使用 [=22] 与 mysql 数据库一起运行=] mysql 连接器。如果它运行 hourly 并查找最近一小时内包含字符串 [/audio]
的 posts,则提取音频文件的 url 并使用它构建一个 link 以在之后追加。这样做的效果是一样的,在 post 生成和 link 可用之间最多延迟一小时。当我完成编码后它应该可以工作,但我确信这不是最好的方法。
有什么建议吗?
这应该可以做到(将其添加到您的 functions.php 文件中)
function wp_audio_shortcode_dowload_link( $html, $atts, $audio, $post_id, $library ) {
$html .='<br><a href="'.$atts['src'].'">Download</a>';
return $html;
}
add_filter( 'wp_audio_shortcode','wp_audio_shortcode_dowload_link',5,10);
在此代码段中,您拥有 [audio] 简码的原始代码。
它位于 wp-includes/media.php
并从第 2171 行开始。此片段中的代码:
2171 function wp_audio_shortcode( $attr, $content = '' ) {
2172 $post_id = get_post() ? get_the_ID() : 0;
2173
2174 static $instance = 0;
2175 $instance++;
2176
2177 /**
2178 * Filter the default audio shortcode output.
2179 *
2180 * If the filtered output isn't empty, it will be used instead of generating the default audio template.
2181 *
2182 * @since 3.6.0
2183 *
2184 * @param string $html Empty variable to be replaced with shortcode markup.
2185 * @param array $attr Attributes of the shortcode. @see wp_audio_shortcode()
2186 * @param string $content Shortcode content.
2187 * @param int $instance Unique numeric ID of this audio shortcode instance.
2188 */
2189 $override = apply_filters( 'wp_audio_shortcode_override', '', $attr, $content, $instance );
2190 if ( '' !== $override ) {
2191 return $override;
2192 }
2193
2194 $audio = null;
2195
2196 $default_types = wp_get_audio_extensions();
2197 $defaults_atts = array(
2198 'src' => '',
2199 'loop' => '',
2200 'autoplay' => '',
2201 'preload' => 'none',
2202 'class' => 'wp-audio-shortcode',
2203 'style' => 'width: 100%; visibility: hidden;'
2204 );
2205 foreach ( $default_types as $type ) {
2206 $defaults_atts[$type] = '';
2207 }
2208
2209 $atts = shortcode_atts( $defaults_atts, $attr, 'audio' );
2210
2211 $primary = false;
2212 if ( ! empty( $atts['src'] ) ) {
2213 $type = wp_check_filetype( $atts['src'], wp_get_mime_types() );
2214 if ( ! in_array( strtolower( $type['ext'] ), $default_types ) ) {
2215 return sprintf( '<a class="wp-embedded-audio" href="%s">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );
2216 }
2217 $primary = true;
2218 array_unshift( $default_types, 'src' );
2219 } else {
2220 foreach ( $default_types as $ext ) {
2221 if ( ! empty( $atts[ $ext ] ) ) {
2222 $type = wp_check_filetype( $atts[ $ext ], wp_get_mime_types() );
2223 if ( strtolower( $type['ext'] ) === $ext ) {
2224 $primary = true;
2225 }
2226 }
2227 }
2228 }
2229
2230 if ( ! $primary ) {
2231 $audios = get_attached_media( 'audio', $post_id );
2232 if ( empty( $audios ) ) {
2233 return;
2234 }
2235
2236 $audio = reset( $audios );
2237 $atts['src'] = wp_get_attachment_url( $audio->ID );
2238 if ( empty( $atts['src'] ) ) {
2239 return;
2240 }
2241
2242 array_unshift( $default_types, 'src' );
2243 }
2244
2245 /**
2246 * Filter the media library used for the audio shortcode.
2247 *
2248 * @since 3.6.0
2249 *
2250 * @param string $library Media library used for the audio shortcode.
2251 */
2252 $library = apply_filters( 'wp_audio_shortcode_library', 'mediaelement' );
2253 if ( 'mediaelement' === $library && did_action( 'init' ) ) {
2254 wp_enqueue_style( 'wp-mediaelement' );
2255 wp_enqueue_script( 'wp-mediaelement' );
2256 }
2257
2258 /**
2259 * Filter the class attribute for the audio shortcode output container.
2260 *
2261 * @since 3.6.0
2262 *
2263 * @param string $class CSS class or list of space-separated classes.
2264 */
2265 $atts['class'] = apply_filters( 'wp_audio_shortcode_class', $atts['class'] );
2266
2267 $html_atts = array(
2268 'class' => $atts['class'],
2269 'id' => sprintf( 'audio-%d-%d', $post_id, $instance ),
2270 'loop' => wp_validate_boolean( $atts['loop'] ),
2271 'autoplay' => wp_validate_boolean( $atts['autoplay'] ),
2272 'preload' => $atts['preload'],
2273 'style' => $atts['style'],
2274 );
2275
2276 // These ones should just be omitted altogether if they are blank
2277 foreach ( array( 'loop', 'autoplay', 'preload' ) as $a ) {
2278 if ( empty( $html_atts[$a] ) ) {
2279 unset( $html_atts[$a] );
2280 }
2281 }
2282
2283 $attr_strings = array();
2284 foreach ( $html_atts as $k => $v ) {
2285 $attr_strings[] = $k . '="' . esc_attr( $v ) . '"';
2286 }
2287
2288 $html = '';
2289 if ( 'mediaelement' === $library && 1 === $instance ) {
2290 $html .= "<!--[if lt IE 9]><script>document.createElement('audio');</script><![endif]-->\n";
2291 }
2292 $html .= sprintf( '<audio %s controls="controls">', join( ' ', $attr_strings ) );
2293
2294 $fileurl = '';
2295 $source = '<source type="%s" src="%s" />';
2296 foreach ( $default_types as $fallback ) {
2297 if ( ! empty( $atts[ $fallback ] ) ) {
2298 if ( empty( $fileurl ) ) {
2299 $fileurl = $atts[ $fallback ];
2300 }
2301 $type = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );
2302 $url = add_query_arg( '_', $instance, $atts[ $fallback ] );
2303 $html .= sprintf( $source, $type['type'], esc_url( $url ) );
2304 }
2305 }
2306
2307 if ( 'mediaelement' === $library ) {
2308 $html .= wp_mediaelement_fallback( $fileurl );
2309 }
2310 $html .= '</audio>';
2311
2312 /**
2313 * Filter the audio shortcode output.
2314 *
2315 * @since 3.6.0
2316 *
2317 * @param string $html Audio shortcode HTML output.
2318 * @param array $atts Array of audio shortcode attributes.
2319 * @param string $audio Audio file.
2320 * @param int $post_id Post ID.
2321 * @param string $library Media library used for the audio shortcode.
2322 */
2323 return apply_filters( 'wp_audio_shortcode', $html, $atts, $audio, $post_id, $library );
2324 }
2325 add_shortcode( 'audio', 'wp_audio_shortcode' );
想法是创建您自己的自定义版本 [音频] 短代码,复制和自定义您活动的子主题或主题的 function.php
文件中的原始代码。
在注册自定义 [audio]
短代码之前,您应该先使用 remove_shortcode( 'audio' );
。
我有一个相当烦人的问题:我有一个 wordpress 网站,除其他外,它提供音频文件。 Wordpress 可以很好地过滤任何媒体插入到 post 并放入播放器,但这对于允许下载文件也不是很好。理想情况下,我想更改生成音频播放器简码的代码,并在 [/audio]
标签后添加 <a href="URL">Click here to download mp3.</a>
,但我的 PHP 几乎不存在。
我目前的方法是使用 python(我很了解)编写一个 hourly cron 脚本,它直接使用 [=22] 与 mysql 数据库一起运行=] mysql 连接器。如果它运行 hourly 并查找最近一小时内包含字符串 [/audio]
的 posts,则提取音频文件的 url 并使用它构建一个 link 以在之后追加。这样做的效果是一样的,在 post 生成和 link 可用之间最多延迟一小时。当我完成编码后它应该可以工作,但我确信这不是最好的方法。
有什么建议吗?
这应该可以做到(将其添加到您的 functions.php 文件中)
function wp_audio_shortcode_dowload_link( $html, $atts, $audio, $post_id, $library ) {
$html .='<br><a href="'.$atts['src'].'">Download</a>';
return $html;
}
add_filter( 'wp_audio_shortcode','wp_audio_shortcode_dowload_link',5,10);
在此代码段中,您拥有 [audio] 简码的原始代码。
它位于 wp-includes/media.php
并从第 2171 行开始。此片段中的代码:
2171 function wp_audio_shortcode( $attr, $content = '' ) {
2172 $post_id = get_post() ? get_the_ID() : 0;
2173
2174 static $instance = 0;
2175 $instance++;
2176
2177 /**
2178 * Filter the default audio shortcode output.
2179 *
2180 * If the filtered output isn't empty, it will be used instead of generating the default audio template.
2181 *
2182 * @since 3.6.0
2183 *
2184 * @param string $html Empty variable to be replaced with shortcode markup.
2185 * @param array $attr Attributes of the shortcode. @see wp_audio_shortcode()
2186 * @param string $content Shortcode content.
2187 * @param int $instance Unique numeric ID of this audio shortcode instance.
2188 */
2189 $override = apply_filters( 'wp_audio_shortcode_override', '', $attr, $content, $instance );
2190 if ( '' !== $override ) {
2191 return $override;
2192 }
2193
2194 $audio = null;
2195
2196 $default_types = wp_get_audio_extensions();
2197 $defaults_atts = array(
2198 'src' => '',
2199 'loop' => '',
2200 'autoplay' => '',
2201 'preload' => 'none',
2202 'class' => 'wp-audio-shortcode',
2203 'style' => 'width: 100%; visibility: hidden;'
2204 );
2205 foreach ( $default_types as $type ) {
2206 $defaults_atts[$type] = '';
2207 }
2208
2209 $atts = shortcode_atts( $defaults_atts, $attr, 'audio' );
2210
2211 $primary = false;
2212 if ( ! empty( $atts['src'] ) ) {
2213 $type = wp_check_filetype( $atts['src'], wp_get_mime_types() );
2214 if ( ! in_array( strtolower( $type['ext'] ), $default_types ) ) {
2215 return sprintf( '<a class="wp-embedded-audio" href="%s">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );
2216 }
2217 $primary = true;
2218 array_unshift( $default_types, 'src' );
2219 } else {
2220 foreach ( $default_types as $ext ) {
2221 if ( ! empty( $atts[ $ext ] ) ) {
2222 $type = wp_check_filetype( $atts[ $ext ], wp_get_mime_types() );
2223 if ( strtolower( $type['ext'] ) === $ext ) {
2224 $primary = true;
2225 }
2226 }
2227 }
2228 }
2229
2230 if ( ! $primary ) {
2231 $audios = get_attached_media( 'audio', $post_id );
2232 if ( empty( $audios ) ) {
2233 return;
2234 }
2235
2236 $audio = reset( $audios );
2237 $atts['src'] = wp_get_attachment_url( $audio->ID );
2238 if ( empty( $atts['src'] ) ) {
2239 return;
2240 }
2241
2242 array_unshift( $default_types, 'src' );
2243 }
2244
2245 /**
2246 * Filter the media library used for the audio shortcode.
2247 *
2248 * @since 3.6.0
2249 *
2250 * @param string $library Media library used for the audio shortcode.
2251 */
2252 $library = apply_filters( 'wp_audio_shortcode_library', 'mediaelement' );
2253 if ( 'mediaelement' === $library && did_action( 'init' ) ) {
2254 wp_enqueue_style( 'wp-mediaelement' );
2255 wp_enqueue_script( 'wp-mediaelement' );
2256 }
2257
2258 /**
2259 * Filter the class attribute for the audio shortcode output container.
2260 *
2261 * @since 3.6.0
2262 *
2263 * @param string $class CSS class or list of space-separated classes.
2264 */
2265 $atts['class'] = apply_filters( 'wp_audio_shortcode_class', $atts['class'] );
2266
2267 $html_atts = array(
2268 'class' => $atts['class'],
2269 'id' => sprintf( 'audio-%d-%d', $post_id, $instance ),
2270 'loop' => wp_validate_boolean( $atts['loop'] ),
2271 'autoplay' => wp_validate_boolean( $atts['autoplay'] ),
2272 'preload' => $atts['preload'],
2273 'style' => $atts['style'],
2274 );
2275
2276 // These ones should just be omitted altogether if they are blank
2277 foreach ( array( 'loop', 'autoplay', 'preload' ) as $a ) {
2278 if ( empty( $html_atts[$a] ) ) {
2279 unset( $html_atts[$a] );
2280 }
2281 }
2282
2283 $attr_strings = array();
2284 foreach ( $html_atts as $k => $v ) {
2285 $attr_strings[] = $k . '="' . esc_attr( $v ) . '"';
2286 }
2287
2288 $html = '';
2289 if ( 'mediaelement' === $library && 1 === $instance ) {
2290 $html .= "<!--[if lt IE 9]><script>document.createElement('audio');</script><![endif]-->\n";
2291 }
2292 $html .= sprintf( '<audio %s controls="controls">', join( ' ', $attr_strings ) );
2293
2294 $fileurl = '';
2295 $source = '<source type="%s" src="%s" />';
2296 foreach ( $default_types as $fallback ) {
2297 if ( ! empty( $atts[ $fallback ] ) ) {
2298 if ( empty( $fileurl ) ) {
2299 $fileurl = $atts[ $fallback ];
2300 }
2301 $type = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );
2302 $url = add_query_arg( '_', $instance, $atts[ $fallback ] );
2303 $html .= sprintf( $source, $type['type'], esc_url( $url ) );
2304 }
2305 }
2306
2307 if ( 'mediaelement' === $library ) {
2308 $html .= wp_mediaelement_fallback( $fileurl );
2309 }
2310 $html .= '</audio>';
2311
2312 /**
2313 * Filter the audio shortcode output.
2314 *
2315 * @since 3.6.0
2316 *
2317 * @param string $html Audio shortcode HTML output.
2318 * @param array $atts Array of audio shortcode attributes.
2319 * @param string $audio Audio file.
2320 * @param int $post_id Post ID.
2321 * @param string $library Media library used for the audio shortcode.
2322 */
2323 return apply_filters( 'wp_audio_shortcode', $html, $atts, $audio, $post_id, $library );
2324 }
2325 add_shortcode( 'audio', 'wp_audio_shortcode' );
想法是创建您自己的自定义版本 [音频] 短代码,复制和自定义您活动的子主题或主题的 function.php
文件中的原始代码。
在注册自定义 [audio]
短代码之前,您应该先使用 remove_shortcode( 'audio' );
。