web-dev-qa-db-ja.com

ログインしていないユーザーの投稿画像を無効にする

ユーザーがログインするまで特定の投稿カテゴリの図/画像を無効にする方法はありますか。画像を除いて投稿のコンテンツ全体を表示する必要があります。

私はプログラマーではありませんし、便利なプラグインも見つかっていません。

2
Adam Robinsson

あなたはPHP strip_tags を使い、 the_content フィルタにフックしてuser がログインしているかどうかを調べることができます

これをあなたの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;

}

編集

代わりに画像を置き換えたい場合は、検索と置き換えを行うためにPHP DOMDocument を使用します。

テキストエンコーディングに関するいくつかの問題はいくつかのHTML5タグのために経験されるか、または警告することができることに注意してください。 StackExchangeで、 Hakre がこれが起こり得る理由を詳しく説明し、 Gordon がそれをよく説明します。

以下の私の解決策では、私は$contentがロードされる前にエンコーディングを定義することによってそれを世話しました。そして、libxmlエラーを一時的に無効にして、 libxml_use_internal_errors を使って警告に悩まされることがないようにします

繰り返しますが、これはあなたの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;

}

編集

それでは、<a>タグを画像の周りにラップすることを考慮に入れた編集を行います。この最初の解決策は、イメージへのリンクを#に置き換えます。

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;

}

その後、<a>タグを完全に削除することもできます。 stackoverflowで matb3 の助けを借りて、私はこの解決策を思いつくことができました。

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;

}

編集

そして、これは特定のカテゴリにのみ適用する方法です

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;

}
2
bynicolas

ログインしていない訪問者のために、キャプションを付けて画像を削除する方法を紹介します。

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 );

つまり、[caption]ショートコードで囲まれた画像のみがテキストに置き換えられます。

キャプションのテキストは空ではなく、はゼロ以外でなければなりません。

あなたのニーズに合わせて調整できることを願います。

これが例です:

no-image

2
birgire