Im Admin-Center auf Exchange klicken, um zum EAC zu gelangen: Postfacheinstellungen im Exchange EAC konfigurieren…
WordPress: Completely block public access to all media files for logged-out users
Two ways, simple in 2. with the help of an Apache rule or in 1. with the help of custom code in a plugin. Version 2 works like a charm but requires putting the logo and other publicly visible items somewhere outside wp-content/uploads
1. Plugin
You can write a plugin using the init
hook and the get-value $_GET[ 'file' ];
. If the user has this get-value, jump in a function to check the rights for access on the files: For example, with a checkbox inside a Meta Box.
add_action( 'init', 'fb_init' ); function fb_init() { // this in a function for init-hook if ( '' != $_GET[ 'file' ] ) { fb_get_file( $_GET[ 'file' ] ); } }
the function fb_get_file()
function fb_get_file( $file ) { $upload = wp_upload_dir(); $the_file = $file; $file = $upload[ 'basedir' ] . '/' . $file; if ( !is_file( $file ) ) { status_header( 404 ); die( '404 — File not found.' ); } else { $image = get_posts( array( 'post_type' => 'attachment', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $the_file ) ) ) ); if ( 0 < count( $image ) && 0 < $image[0] -> post_parent ) { // attachment found and parent available if ( post_password_required( $image[0] -> post_parent ) ) { // password for the post is not available wp_die( get_the_password_form() );// show the password form } $status = get_post_meta( $image[0] -> post_parent, '_inpsyde_protect_content', true ); if ( 1 == $status && !is_user_logged_in() ) { wp_redirect( wp_login_url( $upload[ 'baseurl' ] . '/' . $the_file ) ); die(); } } else { // not a normal attachment check for thumbnail $filename = pathinfo( $the_file ); $images = get_posts( array( 'post_type' => 'attachment', 'meta_query' => array( array( 'key' => '_wp_attachment_metadata', 'compare' => 'LIKE', 'value' => $filename[ 'filename' ] . '.' . $filename[ 'extension' ] ) ) ) ); if ( 0 < count( $images ) ) { foreach ( $images as $SINGLEimage ) { $meta = wp_get_attachment_metadata( $SINGLEimage -> ID ); if ( 0 < count( $meta[ 'sizes' ] ) ) { $filepath = pathinfo( $meta[ 'file' ] ); if ( $filepath[ 'dirname' ] == $filename[ 'dirname' ] ) {// current path of the thumbnail foreach ( $meta[ 'sizes' ] as $SINGLEsize ) { if ( $filename[ 'filename' ] . '.' . $filename[ 'extension' ] == $SINGLEsize[ 'file' ] ) { if ( post_password_required( $SINGLEimage -> post_parent ) ) { // password for the post is not available wp_die( get_the_password_form() );// show the password form } die('dD'); $status = get_post_meta( $SINGLEimage -> post_parent, '_inpsyde_protect_content', true ); if ( 1 == $status && !is_user_logged_in() ) { wp_redirect( wp_login_url( $upload[ 'baseurl' ] . '/' . $the_file ) ); die(); } } } } } } } } } $mime = wp_check_filetype( $file ); if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) ) $mime[ 'type' ] = mime_content_type( $file ); if( $mime[ 'type' ] ) $mimetype = $mime[ 'type' ]; else $mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 ); header( 'Content-type: ' . $mimetype ); // always send this if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) ) header( 'Content-Length: ' . filesize( $file ) ); $last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) ); $etag = '"' . md5( $last_modified ) . '"'; header( "Last-Modified: $last_modified GMT" ); header( 'ETag: ' . $etag ); header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' ); // Support for Conditional GET $client_etag = isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ? stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) : false; if( ! isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) $_SERVER['HTTP_IF_MODIFIED_SINCE'] = false; $client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ); // If string is empty, return 0. If not, attempt to parse into a timestamp $client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0; // Make a timestamp for our most recent modification... $modified_timestamp = strtotime($last_modified); if ( ( $client_last_modified && $client_etag ) ? ( ( $client_modified_timestamp >= $modified_timestamp) && ( $client_etag == $etag ) ) : ( ( $client_modified_timestamp >= $modified_timestamp) || ( $client_etag == $etag ) ) ) { status_header( 304 ); exit; } // If we made it this far, just serve the file readfile( $file ); die(); }
You can also add a custom URL for files via the hook generate_rewrite_rules
add_filter( 'generate_rewrite_rules', 'fb_generate_rewrite_rules' ); function fb_generate_rewrite_rules( $wprewrite ) { $upload = wp_upload_dir(); $path = str_replace( site_url( '/' ), '', $upload[ 'baseurl' ] ); $wprewrite -> non_wp_rules = array( $path . '/(.*)' => 'index.php?file=$1' ); return $wprewrite; }
2. .htaccess Apache check for the Cookie
Leave a new .htaccess file inside of the /wp-content/uploads/
directory. Or an other defined directory for the uploads.
How it works
Inside of the <IfModule>
containers, there are three rules that do the following:
- Check if the request is for any file
- Check for the absence of a cookie that begins with
wordpress_logged_in_
- If these conditions are met, the file request will be denied via 403 „Forbidden“ response
The trick here is step 2, then check for the absence of a cookie that begins with wordpress_logged_in_
. When the user is logged in, WordPress adds a cookie to your browser that looks like:
wordpress_logged_in_1234567890abcdefghijklmnopqrstuvwxyz
Example rule with a check for file type
# require login for media files <IfModule mod_rewrite.c> RewriteCond %{REQUEST_FILENAME} (.*) RewriteCond %{HTTP_COOKIE} !wordpress_logged_in_([a-zA-Z0-9_]*) [NC] RewriteRule .* - [F,L] </IfModule>
In the total Theme you then should make the logo use an absolute URL
Also, often it is good to redirect any kind of archive as well. Just an explanation. Archive pages include category, tag, author, date, custom post type, and custom taxonomy based archives.
Put the logo.svg in the root directory of the installation for this example, or change the path to sth. other than wp-content/uploads
// Modify default logo class so it hides at the mobile breakpoint.
add_filter( 'totaltheme/header/logo/image_class', function( $class ) {
$class[] = 'hidden';
return $class;
} );
// Insert new custom logo image after the default image to display on mobile.
add_filter( 'totaltheme/header/logo', function( $logo_html ) {
$logo_class = wpex_header_logo_img_class();
//$logo_class = str_replace( 'hide-at-mm-breakpoint', 'show-at-mm-breakpoint', $logo_class ); // switch classes.
$extra_logo = '<a href="/"><img src="/logo.svg" width="253px" height="85px"></a>'; //' . esc_attr( $logo_class ) .'
return $logo_html . $extra_logo;
} );
function enym_remove_archives_guest_access() {
if( is_archive() && !is_user_logged_in() ) {
wp_redirect( site_url() );
die;
}
}
add_action( 'template_redirect','enym_remove_archives_guest_access' );
Dieser Beitrag hat 0 Kommentare