ギャラリーの画像キャプションを検索対象にする方法

昔の記事でアイキャッチ画像が設定されていない記事が目について、麦に関する記事だから、確か麦畑の写真があったはず、と思い、サイト内検索したら、出てこない。

ギャラリー内の画像のキャプションに確かに「麦」という語を使っていたはずであった。それが引っかからない。

 

画像に説明文を付けても検索結果に含まれないのはおかしい。

 

それで、検索対象に画像キャプションも含めるようにした。

 

attachment,  inherit を検索対象にする

 

画像キャプションの文字列は、 wp_posts テーブル内の、post_excerpt カラム(行)に格納されている。

post_type は attachmentで、

post_status は、inherit となっている。親の記事の公開状態に依存するということ。

この3点だけ検索対象に含めれば良い。

 

functions.php に次を追加する。

 

 // inherit  attachment
function change_search_char( $where, $obj ) {
if ( $obj->is_search ) {
    $where = str_replace("publish", "publish' OR wp_posts.post_status = 'inherit", $where );
    $where = str_replace("wp_posts.post_type = 'post'", "wp_posts.post_type IN ('post', 'page', 'attachment')", $where );
}
return $where;
}
add_filter( 'posts_where', 'change_search_char', 10, 2 );

 

これで画像とキャプションだけの頁が検索結果に表示される。

検索結果にはそのままでは、サムネイル画像は表示され無い。タイトルも画像のファイル名になっていて見栄えが悪い。キャプションも表示されていない。

それで、このアタッチメント画像の元の親記事のサムネイルと画像のキャプションが抜粋文として表示されるようにする。リンク先も親記事にする。

 

検索結果が表示されるphp に次のように記述する。search.php など。

stork_custom: parts_archive_simple.php

<div class="top-post-list">
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<article <?php post_class('post-list animated fadeIn'); ?> role="article">
	
<a href="<?php echo get_permalink($post->post_parent); ?>" class="cf">

<?php if ( has_post_thumbnail($post->post_parent)) : ?>
<figure class="eyecatch">
<?php echo get_the_post_thumbnail($post->post_parent, 'post-thum'); ?>
<span class="wpp-views"><?php the_views(); ?><?php echo get_post_meta($post->post_parent, views, true); ?></span>

<?php 
// SHOW YOAST PRIMARY CATEGORY, OR FIRST CATEGORY
$category = get_the_category($post->post_parent);
$useCatLink = false;
// If post has a category assigned.
if ($category){
	$category_display = '';
	$category_link = '';
	if ( class_exists('WPSEO_Primary_Term') )
	{
		// Show the post's 'Primary' category, if this Yoast feature is available, & one is set
		$wpseo_primary_term = new WPSEO_Primary_Term( 'category', get_the_id() );
		$wpseo_primary_term = $wpseo_primary_term->get_primary_term();
		$term = get_term( $wpseo_primary_term );
		if (is_wp_error($term)) { 
			// Default to first category (not Yoast) if an error is returned
			$category_display = $category[0]->name;
			$category_link = get_category_link( $category[0]->term_id );
			$now_id = $category[0]->term_id; 
		} else { 
			// Yoast Primary category
			$category_display = $term->name;
			$category_link = get_category_link( $term->term_id );
			$now_id = $term->term_id; 
		}
	} 
	else {
		// Default, display the first category in WP's list of assigned categories
		$category_display = $category[0]->name;
		$category_link = get_category_link( $category[0]->term_id );
		$now_id = $category[0]->term_id; 
	}
	// Display category   $useCatLink = false or true で切替
	if ( !empty($category_display) ){
	    if ( $useCatLink == true && !empty($category_link) ){
		echo '<a href="'.$category_link.'">'.htmlspecialchars($category_display).'</a>';
	    } else {
		echo '<span class="cat-name">'.htmlspecialchars($category_display).'</span>';
	    }
	}
}
?>
	  
</figure>
<?php else: ?>
<figure class="eyecatch noimg">
<img width="175" height="116" src="https://makotoiwasaki.com/wp-content/uploads/2017/02/P1004001-2-175x116.jpg" class="wp-post-image lazyload">
<span class="wpp-views"><?php the_views(); ?><?php echo get_post_meta($post->post_parent, views, true); ?></span>
   
</figure>
<?php endif; ?>

<section class="entry-content">


<h1 class="h2 entry-title"><?php
echo empty( $post->post_parent ) ? get_the_title( $post->ID ) : get_the_title( $post->post_parent );
?></h1>

<p class="byline entry-meta vcard">
<span class="date gf updated"><?php echo get_the_time('Y.m.d', $post->post_parent); ?></span>
<span class="writer name author"><span class="fn"><?php the_author(); ?></span></span>
</p>

<?php if( !is_mobile() ): ?>
<div class="description"><?php echo get_kirei_excerpt( get_the_excerpt(), 140) ?></div>
<?php endif; ?>

</section>
</a>
</article>

<?php endwhile; ?>

 

以上でアタッチメント頁の親記事のリンクが検索結果に表示される。

スラッグも検索対象にする方法

URLの記事のファイル名はWordpressでは、スラッグと呼ばれている。

この記事のファイル名で検索したら引っかからないので、スラッグも検索対象にする。

functions.php に次を追加する。

 

/**
 * サイト内検索の範囲に、カテゴリー名、タグ名、スラッグを含める
 */
function custom_search($search, $wp_query) {
global $wpdb;
 
//サーチページ以外だったら終了
if (!$wp_query->is_search)
 return $search;

if (!isset($wp_query->query_vars))
 return $search;
 
// ユーザー名とか、タグ名・カテゴリ名も検索対象に
$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
 if ( count($search_words) > 0 ) {
   $search = '';
   foreach ( $search_words as $word ) {
     if ( !empty($word) ) {
       $search_word = $wpdb->escape("%{$word}%");
       $search .= " AND (
           {$wpdb->posts}.post_title COLLATE utf8mb4_general_ci LIKE '{$search_word}'
           OR {$wpdb->posts}.post_content COLLATE utf8mb4_general_ci LIKE '{$search_word}'
           OR {$wpdb->posts}.post_excerpt COLLATE utf8mb4_general_ci LIKE '{$search_word}'
           OR {$wpdb->posts}.post_name COLLATE utf8mb4_general_ci LIKE '{$search_word}'
           OR {$wpdb->posts}.post_author IN (
             SELECT distinct ID
             FROM {$wpdb->users}
             WHERE display_name LIKE '{$search_word}'
             )
           OR {$wpdb->posts}.ID IN (
             SELECT distinct r.object_id
             FROM {$wpdb->term_relationships} AS r
             INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id
             INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
             WHERE t.name LIKE '{$search_word}'
           OR t.slug LIKE '{$search_word}'
           OR tt.description LIKE '{$search_word}'
           )
       ) ";
     }
   }
 }
 
 return $search;
 }
 add_filter('posts_search','custom_search', 10, 2);

 

クエリログを見る方法

検索した時に、データーベースに対してどういう活動をしているのか、 Mysql、 MariaDB のクエリログを見てみる。

 

/etc/my.cnf/server.cnf

に次を追記して、再起動する。

 

[server]
general_log=1
general_log_file=/var/log/mysql/general-query.log

SSH でサーバーにログインし、 tail -f でログを見る。

tail -f /var/log/mysql/general-query.log

plugin load filter を使用すると、検索クエリが2回発生する

ログを見ると、検索した時にクエリ問い合わせが2回発生していることに気づいた。

443 Query    SHOW FULL COLUMNS FROM `wp_posts`
443 Query    SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND (((wp_posts.post_title LIKE '%麦が実る%') OR (wp_posts.post_excerpt LIKE '%麦が実る%') OR (wp_posts.post_content LIKE '%麦が実る%')))  AND (wp_posts.post_password = '')  AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish')  ORDER BY wp_posts.post_title LIKE '%麦が実る%' DESC, wp_posts.post_date DESC LIMIT 0, 18
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'kusanagi-image-optimizer-settings' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = '_transient_timeout_jetpack_idc_allowed' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = '_transient_jetpack_idc_allowed' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'jetpack_sync_error_idc' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'jetpack_excluded_extensions' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'jetpack_edit_links_calypso_redirect' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'lazy_load_responsive_images_native_loading_plugin' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'lazy_load_responsive_images_unveilhooks_plugin' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'lazy_load_responsive_images_enable_for_audios' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'lazy_load_responsive_images_aspectratio_plugin' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'lazy_load_responsive_images_loading_spinner' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'lazy_load_responsive_images_granular_disable_option' LIMIT 1
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'uninstall_plugins' LIMIT 1
443 Query    SELECT * FROM wp_users WHERE user_login = 'maco' LIMIT 1
443 Query    SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (1) ORDER BY umeta_id ASC
443 Query    SELECT option_value FROM wp_options WHERE option_name = 'can_compress_scripts' LIMIT 1
443 Query    SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND (((wp_posts.post_title COLLATE utf8mb4_general_ci LIKE '%麦が実る%') OR (wp_posts.post_excerpt COLLATE utf8mb4_general_ci LIKE '%麦が実る%') OR (wp_posts.post_content COLLATE utf8mb4_general_ci LIKE '%麦が実る%')))  AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'inherit' OR wp_posts.post_status = 'private')  ORDER BY wp_posts.post_title LIKE '%麦が実る%' DESC, wp_posts.post_date DESC LIMIT 0, 18
443 Query    SELECT FOUND_ROWS()

 

テーマを変えてみるとクエリは一回のみだったので、何かがおかしい。何かのプラグインが介入しているのだろう。

いくつかプラグインを停止してみると、2回目のクエリがなくなった。

plugin load filter が原因だった。

これをしばらく止めておく。

画像アタッチメント頁 attachment.php の作成

添付画像の頁が検索結果に表示され、それをクリックした時に表示されるテンプレートは、attachment.php。

これがなかったので、次のように作成した。

 

<?php get_header(); ?>

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<!-- Latest compiled and minified JavaScript -->
<script defer src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

<div class="container">
<div class="row">
<div class="col-lg-6" style="margin-bottom: 40px; padding: 0 50px 0 50px;">
<?php echo wp_get_attachment_link( get_the_ID(), 'medium' ); ?>
</div>
	
<div class="col-lg-6">
<div class="panel panel-primary" style="max-width: 500px; border-radius: 0px; margin-top: 0px; border: 3px solid #000;">
<div class="panel-heading" style="background: #000 !important; text-align: left; border-radius: 0px; border-bottom: 0px;"><strong><i class="fa fa-info-circle fa-lg"></i> Attachment information</strong></div>
<div class="panel-body" style="background-color: #fff;">
<ul class="fa-ul" style="text-align: left;">
<li><i class="fa-li fa fa-arrow-right"></i><strong>Title </strong>: <?php the_title(); ?></li>
<li><?php if ( has_excerpt() ) : ?><div class="entry-caption"><strong>Excerpt </strong>: <?php the_excerpt(); ?></div></li><?php endif; ?>
<li><i class="fa-li fa fa-arrow-right"></i><strong>Author name</strong> : <?php the_author(); ?></li>
<li><i class="fa-li fa fa-arrow-right"></i><strong>Post name</strong> : <a href="<?php echo get_permalink($post->post_parent); ?>"><?php
echo empty( $post->post_parent ) ? get_the_title( $post->ID ) : get_the_title( $post->post_parent );
?></a></li>
<li>
<?php
$meta = wp_get_attachment_metadata($id);
           echo "Credit:  ".$meta[image_meta][credit]."<br /> ";
           echo "Camera:  ".$meta[image_meta][camera]."<br />";
           echo "Focal length:  ".$meta[image_meta][focal_length]."<br />";
           echo "Aperture:  ".$meta[image_meta][aperture]."<br />";
           echo "ISO:  ".$meta[image_meta][iso]."<br />";
           echo "Shutter speed:  ".$meta[image_meta][shutter_speed]."<br />";
           echo "Time Stamp:  ".$meta[image_meta][created_timestamp]."<br />";
			echo "Keyword:  ".implode(", ", $meta[image_meta][keywords])."<br />";
           echo "Copyright:  ".$meta[image_meta][copyright];
  ?>
</li>
	
</ul>
  </div>  </div>  
<p>Select your image size and download</p>
<p class='resolutions'> Downloads: 
<?php
            $images = array();
            $image_sizes = get_intermediate_image_sizes();
            array_unshift( $image_sizes, 'full' );
            foreach( $image_sizes as $image_size ) {
            $image = wp_get_attachment_image_src( get_the_ID(), $image_size );
            $name = $image_size . ' (' . $image[1] . 'x' . $image[2] . ')';
            $images[] = '<a href="' . $image[0] . '">' . $name . '</a>';
          }
       echo implode( ' | ', $images );
   ?>
</p>
</div>
</div></div>

<?php get_footer(); ?>

 

 

この様に表示される。

 

 

 

  • またまたこのサイトのSSL証明書が期限切れになった。 Kusanagi の自動更新ができていない。 それで手動であれこれしてみても、こんなエラーが出る。# kusanagi update cert Challenge failed for domain makotoiwasaki.com Challenge failed for domain www.makotoiwasaki.com Attempting to renew cert (makotoiwasaki.com) from /etc/letsencrypt/renewal/makotoiwasaki.com.conf produced an unexpected error: Some challenges hav...
  • Google の Indexing API を使うと、新しい投稿記事を瞬時にGoogleの検索エンジンに登録できる。 WordPress のプラグインとしてインデックスAPIが利用できる。使い方は英語だが、この通り: ⏱️ Get Google To Index Your Website Instantly Using the Indexing API ⚡Take a look at how you can use Google's new indexing API & to get your website's pages and content crawled instantly instead of waiting for Google to...
  • Yoast SEO を停止して、Rank Math SEO プラグインを使ってみたらGoogle の検索結果に表示される記事抜粋スニペットの文字数が短過ぎに見えてびっくりした。#1 Yoast Alternative You Deserve - Rank Math SEO vs. Yoast SEORank Math SEO plugin for WordPress is hands down the best Yoast alternative WordPress plugin. And the best thing is, Rank Math is completely FREE!Rank Math
  • WP_CRON を停止して、Linux の crontab に移行する設定をこれまでに何度も試みたがうまくいかなかった。 毎日バックアップされるはずの、UpdraftPlus プラグインのクロンが動いていない。やっと成功した設定方法を記録しておく。wp-config.php に次の行を追加する。define('DISABLE_WP_CRON', true);/var/spool/cron  に、  httpd という名前のファイルを作成し、次の1行を追加する。 所有者を httpd.www など、httpd nginx サーバーの稼働ユーザー名と同じにする。nginx.conf に書いてある。root@s4:/v...
  • Kusanagi WordPress プラットフォームでは Fcache とBcache がある。 Fcache とはNginx ヱブサーバーのキャッシュ機能であり、Kusanagi の独自機能ではない。Nginx のアクセスログを眺めていると、  BYPASS MISS EXPIRED のみで、HITが殆どない。 トップ頁、アーカイブリストの頁ではHIT、 個別投稿頁では、BYPASS MISS EXPIRED ばかりでHITがない。Kusanagi fcache on とすると、fcache は有効になったかのように思えるが、本当にキャッシュが効いているのかどうかはログで確認しないとわからない。まず、Wordpressの編集画面にログインし...
  • 目次1 HTTPD アクセスログの日本語化2 Logwatch も日本語化 HTTPD アクセスログの日本語化 Nginx,  Apache ヱブサーバーのアクセスログを見ると、日本語URLはエンコードされていて読めない。 そこで、デコードして表示させる。 ログのファイル名が ssl_access.log だとすると、tail -f ssl_access.log| perl -ne 'use URI::Escape; print uri_unescape($_);' tail -f access.log | php -R 'echo urldecode($argn)."\n";'で、日本語URlが読める状態で出力される。 Apa...
  • ヱブサイトの再構築中には、スタイルシート、style.css を頻繁に調整更新する。 CSSを追加、編集する度に再読み込みを繰り返して、変更の反映を確認していた。 これで編集者は反映を確認できるのだが、一般閲覧者はわざわざ再読み込みしたり、キャッシュを削除したりするはずはないので、変更が反映されていない崩れたデザインを見ているかもしれない。わざわざリロードしたりキャッシュを削除したりしなくても変更が確実に反映されるような設定方法を発見した。wp_enqueue_scripts で CSS、JS の読み込みを管理している場合には、次のようにfunctions.php に記述する。// 子テーマのstyle.cssを最後に読み込む add_acti...
  • 2679年8月25日

    頁カウンターの比較 WordPress

    WordPressで使える頁カウンターをいくつか同時に使ってカウントの仕方の違いを比べてみた。WP-PostViews    長期常用中 Post Views Counter  新規インストール Google Analytics Post Pageviews Pjaxblog の付属カウンター機能WP-PostViews は他のカウンターよりもカウントが多くなりがちなことに気づいた。一度のアクセスなのに2回カウントされることもあるようだ。ロボットクローラー Bots のリスト数も不十分に少ないような気がする。それで数が多くなりやすいのではないか。 それで Post Views Counter に乗り換えることにした。Post Views Cou...

WordPress カテゴリ人気記事 Views most

WordPress カテゴリ人気記事 月間

タグ関連記事

閲覧履歴

    //cookieが無い場合の処理