ユーザーがログインするまで特定の投稿カテゴリの図/画像を無効にする方法はありますか。画像を除いて投稿のコンテンツ全体を表示する必要があります。
私はプログラマーではありませんし、便利なプラグインも見つかっていません。
あなたは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;
}
ログインしていない訪問者のために、キャプションを付けて画像を削除する方法を紹介します。
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]
ショートコードで囲まれた画像のみがテキストに置き換えられます。
キャプションのテキストは空ではなく、幅はゼロ以外でなければなりません。
あなたのニーズに合わせて調整できることを願います。
これが例です: