Smart Custom Fieldsで特定の固定ページだけでカスタムフィールドを表示する

WordPressのテーマカスタマイズをする時に必須なカスタムフィールドですが、カスタムフィールドを実装する時には必ずといっていいほどSmart Custom Fieldsを利用しています。

管理画面から固定ページを選択することもできるのですが、カスタマイズやテーマ制作をおこなう時はなるべくコードで設定も完結したいため、PHPによるフィードの設定・管理ができる点もSmart Custom Fieldsを重宝している理由です。

IDの一致を条件として条件分岐することはできるのですが、パーマリンクなどで使われるスラッグをもとに条件分岐したい時はちょっと一工夫必要です。

Smart Custom Fieldsを有効化し下記コードをfunctions.phpに記載すると特定のスラッグのページに指定のカスタムフィールドを表示することができます。

function my_register_fields($settings, $type, $id, $meta_type) {
	// パーマリンクがslugとなっているページのIDを取得
	$page_object = get_page_by_path("slug");
	$page_id = $page_object->ID;

	// 取得したスラッグであれば下記のフィールドを表示
	if ( $id == $page_id ) { 
		$Setting = SCF::add_setting('id-1', 'メタボックスのタイトル');
		$Setting->add_group('slug_group', false, array(
			array(
				'type'        => 'text',
				'name'        => 'slug_name',
				'label'       => '名前',
			),

			array(
				'name' => 'slug_thumb',
				'label' => 'サムネイル',
				'type' => 'image',
				'size' => 'full',
				'notes' => '推奨サイズ 000x000', 
			),
		));
		$settings[] = $Setting;
	}
	return $settings;
}
add_filter('smart-cf-register-fields', 'my_register_fields', 10, 4);

投稿からタグの一覧を取得

WordPressのループ内で記事が選択しているタグの一覧を出すためのコードスニペットです。
下記関連記事のget_tagsだと登録しているタグが表示されてしまったので、覚書きのために記載。

【WordPress】タグ一覧・カテゴリー一覧をリンク付きで取得する例

<?php
$keyword_tags = get_the_tags();
$tag_count = 0;
$max_count = 10;
foreach ($keyword_tags as $tag) {
	$tag_name = esc_html( $tag->name );
	if ($tag_count >= $max_count) {
		break;
	} else {
		echo '<div class="the_tags>' . $tag_name . '</div>';
		$tag_count++;
	}
}
?>

Simple GA Rankingの関数を使ったカスタマイズで特定の記事を除外する

Simple GA Rankingの関数を使ったカスタマイズで特定の記事を除外する方法です。
配列でオプションを渡すと表示する記事数やカテゴリー・タクソノミーの除外をすることができます。

<?php 
array(
    'display_count'           => 10,
    'period'                  => 30,
    'post_type'               => 'post',
    'exclude_post_type'       => '',
    '`taxonomy_slug`__in'     => '',
    '`taxonomy_slug`__not_in' => '',
    'filter'                  => ''
);
?>

ショートコードで特定のURLを除外する方法はすぐ見つかったのですが、出力結果をいじりたかったりテーマをカスタマイズしている場合には使いずらかったので、他の方法を探してみました。
下記のコードでは表示を10件にし、https://susu.mu/newsのURLをすべて除外する事ができます。

Google Analytics APIの仕様どおりにfilterパラメータを指定すると特定のURLの記事を除外できます。

<?php
$args   = array(
	'display_count' => 10,
	'filter' => 'ga:pagepath!=/news',

);
$ranking_data = sga_ranking_get_date( $args );
if ( function_exists( 'sga_ranking_get_date' ) ) {
	if ( ! empty( $ranking_data ) ) { ?>
		<section>
			<header>
				<h1>人気記事ランキング</h1>
			</header>
			<div>
				<?php foreach ( $ranking_data as $post_id ) {
					set_query_var( 'post_id', $post_id );
					get_template_part('template-parts/loop','ranking');
				} ?>
			</div>
			<div class="readmore"><a href="/ranking"><span>人気記事ランキングをもっと見る →</span></a></div>
		</section>
	<?php
	}
}
endif;
?>

関連リンク

WordPressのカスタムRSSを作る時にimgタグをfigureタグで覆う時のコード

WordPressでRSSのカスタマイズをおこなっていて、フォーマットに合わせたコンテンツのリプレイスをおこないたいのですが思ったようにパターンがかけなかったので調べました。

今回の目的はWordPressでエディタから画像を投稿すると、pタグで覆われてimgタグが表示されるのでその場合はfigureタグとfigurecaptionを追加することです。
さらにWordPressでキャプションが設定されている画像はすでにfigureタグがついているのでその内容を消さなようにしなければいけません。

下記が最終的に実装したコードです。

$content = preg_replace('/<p>(<img [^>]*src="([^"]*)"[^>]*>)<\/p>/i', '<figure>$1<figcaption></figcaption></figure>',$content);
echo $content;

/php

WooCommerceのcart.phpからボタンを押してwp_mailでメールを送信する

jQueryを利用してajaxで非同期通信をおこないメールの送信ボタンの表示とwp_mailでメールを送信する処理をする。

cart.php

<script>
	var mail_path = "<?php echo get_stylesheet_directory_uri()?>/path/estimate.php"
	console.log(mail_path);
	jQuery(function () {
		jQuery('#estimate_mail-button').toggle(
			function () {
				jQuery.ajax({
					url: mail_path,
					data: {
						item_name: '商品の名前',
						item_price: '2000',
						item_quantity: '10'
					},
					success: function (data) {
						jQuery('#estimate_mail-ajax').html(data);
						jQuery('#estimate_mail-textStatus').text('送信成功');
					},
					error: function (data) {
						jQuery('#estimate_mail-textStatus').text('送信失敗');
					}
				});
			},
			function () {
				jQuery('#estimate_mail-ajax').html('');
				jQuery('#estimate_mail-textStatus').text('');
			}
		);
	});
</script>


<div id="estimate_mail">
	<p>
		<button id="estimate_mail-button">見積もりを送信する</button>
		<span id="estimate_mail-textStatus"></span>
	</p>
</div>

estimate.php

<?php
function estimate() {
	require_once("../../../../wp-load.php");

	wp_mail( 'me@example.com', 'The subject', 'The content');
}
estimate();



参考URL