Deshabilitar la publicación de imágenes para usuarios no registrados

2

¿Hay alguna forma clara de desactivar las figuras / imágenes en una determinada categoría de publicación hasta que un usuario inicie sesión? Quiero que todo el contenido de la publicación sea visible, excepto las imágenes.

No soy un programador y no he encontrado ningún complemento útil.

    
pregunta Adam Robinsson 28.08.2016 - 20:17

2 respuestas

2

Puedes usar PHP strip_tags y enganchar a the_content se filtra comprobando si el usuario está conectado .

agrega esto a tu archivo 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, '<p><a><h2><span><div>'); 


  }

  return $content;

}

EDIT

Si desea reemplazar la imagen en su lugar, usaría PHP DOMDocument para realizar la búsqueda y reemplazar.

Tenga en cuenta que algunos problemas con la codificación de texto pueden experimentarse o advertencias para algunas etiquetas HTML5. Hakre explica en profundidad por qué puede suceder esto y Gordon lo explica bien, tanto en StackExchange.

En mi solución a continuación, me encargué de eso al definir la codificación antes de cargar el $content . Y deshabilitar temporalmente los errores de libxml para que no nos molesten las advertencias al utilizar libxml_use_internal_errors

de nuevo, esto va a tu 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;

}

EDIT

Bien, aquí hay una edición que tiene en cuenta el ajuste de las etiquetas <a> alrededor de las imágenes. Esta primera solución reemplazará el enlace a la imagen con un #

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 <a> tag, replace href link with an #

        $img->parentNode->setAttribute( 'href', '#' );

      }

    }

    $content = $dom->saveHTML();

  }

  return $content;

}

Entonces también podrías eliminar la etiqueta <a> por completo. Con la ayuda de matb33 sobre stackoverflow, logré encontrar esta solución.

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  <a> tag as a parent apply replace our <a> tag with our <img> 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 <a> tag with our <img> tag

      }

    }

    $content = $dom->saveHTML();

  }

  return $content;

}

EDIT

Y aquí es cómo aplicar solo a categorías específicas

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  <a> tag as a parent apply replace our <a> tag with our <img> 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 <a> tag with our <img> tag

      }

    }

    $content = $dom->saveHTML();

  }

  return $content;

}
    
respondido por el bynicolas 28.08.2016 - 20:36
2

Aquí hay una sugerencia sobre cómo eliminar imágenes, con título , para los visitantes (sin iniciar sesión):

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( 
            '<div class="%s" width="%d">%s</div>',
            esc_attr( $class ),
            (int) $width,
            esc_html__( 'Please log in to view the image', 'mydomain' )
        );
}, 10, 3 );

es decir, solo las imágenes que están envueltas dentro del código corto [caption] se reemplazan con un texto.

El texto del título no debe estar vacío y el ancho no es cero.

Espero que puedas ajustarlo a tus necesidades.

Aquí hay un ejemplo:

    
respondido por el birgire 28.08.2016 - 21:22

Lea otras preguntas en las etiquetas