Deaktivieren von Post-Images für nicht angemeldete Benutzer

Gibt es eine nette Möglichkeit, die Bilder / Bilder in einer bestimmten Post-Kategorie zu deaktivieren, bis sich ein Benutzer anmeldet. Ich möchte, dass der gesamte Post-Inhalt mit Ausnahme der Bilder sichtbar ist.

Ich bin kein Programmierer und habe kein nützliches Plugin gefunden.

Solutions Collecting From Web of "Deaktivieren von Post-Images für nicht angemeldete Benutzer"

Sie können PHP strip_tags und den hook zum Filter ” the_content , indem Sie prüfen, ob der Benutzer angemeldet ist .

füge das zu deiner functions.php

 add_filter( 'the_content', 'wpse_remove_img' ); function wpse_remove_img( $content ){ if( ! is_user_logged_in() ){ // You need to specify which tag you want to keep here it's p, a, h2,span, div. // Adjust accordingly (you might want to add other or remove all) $content = strip_tags($content, '

'); } return $content; }

BEARBEITEN

Wenn Sie stattdessen das Bild ersetzen möchten, würde ich PHP DOMDocument verwenden , um die Suche und den Austausch durchzuführen.

Beachten Sie, dass bei einigen HTML5-Tags einige Probleme mit der Textcodierung oder Warnungen auftreten können. Hakre erklärt eingehend, warum dies passieren kann und Gordon erklärt dies auf StackExchange.

In meiner Lösung unten habe ich darauf geachtet, indem ich die Kodierung definiert habe, bevor der $content geladen wird. Und zeitweilige Deaktivierung von libxml-Fehlern, sodass wir nicht mit Warnungen durch Verwendung von libxml_use_internal_errors

Auch dies geht in deine functions.php

 add_filter( 'the_content', 'wpse_replace_img' ); function wpse_replace_img( $content ){ if( ! is_user_logged_in() ){ $dom = new DOMDocument(); libxml_use_internal_errors(true); // deactivating errors // Load without added HTML and doctype, see https://stackoverflow.com/a/22490902/4643867 $dom->loadHTML( '< ?xml encoding="UTF-8">' . $content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); // adding encoding libxml_use_internal_errors(false); // reactivating errors $tags = $dom->getElementsByTagName( 'img' ); foreach ($tags as $img) { $new_src_url = 'http://url/to/your/filler-image.jpg'; $img->setAttribute( 'src', $new_src_url ); $img->setAttribute( 'srcset', '' ); } $content = $dom->saveHTML(); } return $content; } 

BEARBEITEN

Ok, hier ist eine Bearbeitung, die das Umschließen von Tags um Bilder berücksichtigt. Diese erste Lösung ersetzt den Link zum Bild mit einem #

 add_filter( 'the_content', 'wpse_replace_img' ); function wpse_replace_img( $content ){ if( ! is_user_logged_in() ){ $dom = new DOMDocument(); libxml_use_internal_errors(true); // Load without added HTML and doctype, see https://stackoverflow.com/a/22490902/4643867 $dom->loadHTML( '< ?xml encoding="UTF-8">' . $content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); // adding encoding libxml_use_internal_errors(false); $tags = $dom->getElementsByTagName( 'img' ); foreach ($tags as $img) { $new_src_url = 'http://url/to/your/filler-image.jpg'; $img->setAttribute( 'src', $new_src_url ); $img->setAttribute( 'srcset', '' ); if( $img->parentNode->tagName == 'a' ){ // if the current image is wrapped by an  tag, replace href link with an # $img->parentNode->setAttribute( 'href', '#' ); } } $content = $dom->saveHTML(); } return $content; } 

Dann könnten Sie auch das -Tag ganz entfernen. Mit etwas Hilfe von matb33 über stackoverflow habe ich diese Lösung gefunden.

 add_filter( 'the_content', 'wpse_replace_img' ); function wpse_replace_img( $content ){ if( ! is_user_logged_in() ){ $dom = new DOMDocument(); libxml_use_internal_errors(true); // Load without added HTML and doctype, see https://stackoverflow.com/a/22490902/4643867 $dom->loadHTML( '< ?xml encoding="UTF-8">' . $content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); // adding encoding libxml_use_internal_errors(false); $tags = $dom->getElementsByTagName( 'img' ); $fragment = $dom->createDocumentFragment(); // Create our new document fragment to manipulate foreach ($tags as $img) { $new_src_url = 'http://url/to/your/filler-image.jpg'; $img->setAttribute( 'src', $new_src_url ); $img->setAttribute( 'srcset', '' ); if( $img->parentNode->tagName == 'a' ){ // if the current image has an  tag as a parent apply replace our  tag with our  tag $a = $img->parentNode; $fragment->appendChild( $img->parentNode->childNodes->item( 0 ) ) ; // store our image node into the fragment $a->parentNode->replaceChild( $fragment, $a ); // replace our  tag with our  tag } } $content = $dom->saveHTML(); } return $content; } 

BEARBEITEN

Und hier gilt, wie man sich nur auf bestimmte Kategorien bezieht

 add_filter( 'the_content', 'wpse_replace_img' ); function wpse_replace_img( $content ){ if( ! is_user_logged_in() ){ $apply_restriction = false; $categories = get_the_category(); $restricted_cat = array( 'restricted_cat_slug' // Our restricted category slug, since it's an array you could provide more than one ); // Performing our check, switch the flag if we find a match foreach( $categories as $cat ){ foreach( $restricted_cat as $r_cat ){ if( $cat->slug == $r_cat ){ $apply_restriction = true; } } } // Bail out without applying any restriction if no category match is found if( ! $apply_restriction ){ return $content; } $dom = new DOMDocument(); libxml_use_internal_errors(true); // Load without added HTML and doctype, see https://stackoverflow.com/a/22490902/4643867 $dom->loadHTML( '< ?xml encoding="UTF-8">' . $content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); // adding encoding libxml_use_internal_errors(false); $tags = $dom->getElementsByTagName( 'img' ); $fragment = $dom->createDocumentFragment(); // Create our new document fragment to manipulate foreach ($tags as $img) { $new_src_url = 'http://url/to/your/filler-image.jpg'; $img->setAttribute( 'src', $new_src_url ); $img->setAttribute( 'srcset', '' ); if( $img->parentNode->tagName == 'a' ){ // if the current image has an  tag as a parent apply replace our  tag with our  tag $a = $img->parentNode; $fragment->appendChild( $img->parentNode->childNodes->item( 0 ) ) ; // store our image node into the fragment $a->parentNode->replaceChild( $fragment, $a ); // replace our  tag with our  tag } } $content = $dom->saveHTML(); } return $content; } 

Hier ist ein Vorschlag zum Entfernen von Bildern mit Bildunterschriften für Besucher (nicht angemeldet):

 add_filter( 'img_caption_shortcode', function( $output, $attr, $content ) { $width = isset( $attr['width'] ) ? $attr['width'] : '300'; $align = isset( $attr['align'] ) ? $attr['align'] : ''; $class = isset( $attr['class'] ) ? $attr['class'] : 'no-image'; $class = sprintf( 'wp-caption %s %s', $align, $class ); return is_user_logged_in() ? $output : sprintf( '
%s
', esc_attr( $class ), (int) $width, esc_html__( 'Please log in to view the image', 'mydomain' ) ); }, 10, 3 );

dh nur Bilder, die innerhalb des [caption] shortcodes eingeschlossen sind, werden durch einen Text ersetzt.

Der Text der Überschrift darf nicht leer und die Breite ungleich Null sein.

Hoffe, Sie können es an Ihre Bedürfnisse anpassen.

Hier ist ein Beispiel:

kein Bild