管理画面のカテゴリー一覧から特定のカテゴリーを除外

Filed under: functions.php — kdcs @ 25年12月22日 月曜日

ダミーのカテゴリーを作成した場合、そのカテゴリーをチェックリストから非表示する方法。

functions.php

function hide_specific_category_in_editor( $args, $taxonomy ) {
    if ( 'category' === $taxonomy ) {
        // 非表示にしたいカテゴリーIDを指定
        $args['exclude'] = array( 123 );
    }
    return $args;
}
add_filter( 'wp_terms_checklist_args', 'hide_specific_category_in_editor', 10, 2 );

この方法のメリット
・完全にチェックリストから消える
・CSS のように「見えないけど存在する」状態ではなく、UI から除外される

WordPress6.9で「global-styles」を出力させない方法

Filed under: functions.php,wordpress — kdcs @ 25年12月14日 日曜日

WordPress 6.9 では「global-styles」の出力方法が変更され、従来の wp_dequeue_style(‘global-styles’) が効かなくなったため「remove_action」で対応する方法。

functions.php

// wp_headで出力される'global-styles'を停止する(wp6.9~)-------------------------
add_action( 'wp_loaded', function() {
    remove_action( 'wp_enqueue_scripts', 'wp_enqueue_global_styles' );
    remove_action( 'wp_footer', 'wp_enqueue_global_styles', 1 );
});

固定ページとカスタム投稿タイプのスラッグが同じだと問題あり

Filed under: functions.php,wordpress — kdcs @ 25年12月9日 火曜日

例で説明
固定ページに「bridal」というパーマリンクを付けた場合にカスタム投稿タイプも「bridal」で作ってしまうと競合してしまい、その結果https://~hogehoge/bridalでアクセスするとbridalのアーカイブテンプレートに飛ばされてしまい、固定ページが表示されない。

解決方法
「bridal」を固定ページで使う場合、「カスタム投稿タイプ bridal」のアーカイブページを別に指定してやると競合しない。

こちらを入れる
archiveを「bridal-list」などに書き換える

            'rewrite' => array('slug' => 'bridal-list'),
            'has_archive' => 'bridal-list',

こちらは通常のカスタム投稿タイプ作成

add_action('init', 'add_bridal_post_type');
function add_bridal_post_type() {
    $params = array(
            'labels' => array(
                    'name' => 'ブライダルプラン',
                    'singular_name' => 'ブライダルプラン',
                    'add_new' => '新規追加',
                    'add_new_item' => 'ブライダルプランを新規追加',
                    'edit_item' => 'ブライダルプランを編集する',
                    'new_item' => '新規ブライダルプラン',
                    'all_items' => 'ブライダルプラン一覧',
                    'view_item' => 'ブライダルプランを見る',
                    'search_items' => '検索する',
                    'not_found' => 'ブライダルプランが見つかりませんでした。',
                    'not_found_in_trash' => 'ゴミ箱内にブライダルプランが見つかりませんでした。'
            ),
            'public' => true,
            'has_archive' => true,
            'supports' => array(
                    'title',
                    'editor',
                    'author',
                    'custom-fields',
                    'thumbnail',
            ),
            'taxonomies' => array('bridal_category','bridal_tag')
    );
    register_post_type('bridal', $params);
}

こちらが対策後

add_action('init', 'add_bridal_post_type');
function add_bridal_post_type() {
    $params = array(
            'labels' => array(
                    'name' => 'ブライダルプラン',
                    'singular_name' => 'ブライダルプラン',
                    'add_new' => '新規追加',
                    'add_new_item' => 'ブライダルプランを新規追加',
                    'edit_item' => 'ブライダルプランを編集する',
                    'new_item' => '新規ブライダルプラン',
                    'all_items' => 'ブライダルプラン一覧',
                    'view_item' => 'ブライダルプランを見る',
                    'search_items' => '検索する',
                    'not_found' => 'ブライダルプランが見つかりませんでした。',
                    'not_found_in_trash' => 'ゴミ箱内にブライダルプランが見つかりませんでした。'
            ),
            'public' => true,
            'has_archive' => true,
            'supports' => array(
                    'title',
                    'editor',
                    'author',
                    'custom-fields',
                    'thumbnail',
            ),
            'taxonomies' => array('bridal_category','bridal_tag'),
            'rewrite' => array('slug' => 'bridal-list'),
            'has_archive' => 'bridal-list',
    );
    register_post_type('bridal', $params);
}

管理画面の投稿一覧に特定の投稿を先頭に表示させる方法

Filed under: functions.php,wordpress — kdcs @ 25年12月2日 火曜日

投稿タイプと先頭固定したい記事のIDを入力

function my_admin_post_order( $orderby, $query ) {
    if ( is_admin() && $query->is_main_query() && $query->get('post_type') === 'banquet_plan' ) {
        $sticky_id = 324;
        global $wpdb;
        // 特定の投稿IDを最上部に、それ以外は通常の並び
        $orderby = "FIELD({$wpdb->posts}.ID, $sticky_id) DESC, {$wpdb->posts}.post_date DESC";
    }
    return $orderby;
}
add_filter( 'posts_orderby', 'my_admin_post_order', 10, 2 );

クラシックエディタでフロート画像をラップする処理

Filed under: css,functions.php — kdcs @ 25年9月23日 火曜日

クラシックエディター(TinyMCE)では画像を「右寄せ」や「左寄せ」にするとfloatが適用されるが、このfloatの解除方法がない。テキストエディタでタグ打ちができればclear: bothを挿入して解除できるが知識が必要。
ビジュアルエディタしか使えない場合、バック部ラウンドで処理する必要がある。

そこで、alignleftやalignrightが付与されたfloat画像をdivタグでラップしてクラスを付ける処理をする。

functions.php(クラスは、class=”imgWrapp”)
※デフォルトの投稿タイプ「post」にだけ適用する

正規表現ベースの軽量版

function wrap_aligned_images_lightweight($content) {
  if (!is_singular('post')) {
    return $content;
  }

  // <p>タグ内に複数のimgタグがあり、すべてがalignクラス付きならラップ
  $pattern = '/<p>\s*((?:<img[^>]+class="[^"]*\balign(?:left|right|center)\b[^"]*"[^>]*>\s*){1,})<\/p>/i';
  $replacement = '<div class="imgWrapp">$1</div>';

  return preg_replace($pattern, $replacement, $content);
}
add_filter('the_content', 'wrap_aligned_images_lightweight');

DOM 操作版(全ての要素をチェックするため処理不可が少しだけ増える 通常の投稿なら問題ないレベル)

function wrap_aligned_images_preserve_position($content) {
  if (!is_singular('post')) {
    return $content;
  }

  libxml_use_internal_errors(true);

  $html = '<?xml encoding="UTF-8"><body>' . $content . '</body>';
  $dom = new DOMDocument('1.0', 'UTF-8');
  $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

  $bodyList = $dom->getElementsByTagName('body');
  if ($bodyList->length === 0) return $content;

  $body = $bodyList->item(0);
  $newBody = $dom->createDocumentFragment();

  foreach ($body->childNodes as $node) {
    if ($node->nodeType === XML_ELEMENT_NODE && $node->tagName === 'p') {
      $imgNodes = [];
      foreach ($node->childNodes as $child) {
        if ($child->nodeType === XML_ELEMENT_NODE && $child->tagName === 'img') {
          $class = $child->getAttribute('class');
          if (preg_match('/align(left|right|center)/', $class)) {
            $imgNodes[] = $child;
          }
        }
      }

      if (count($imgNodes) > 0 && count($node->childNodes) === count($imgNodes)) {
        $wrapper = $dom->createElement('div');
        $wrapper->setAttribute('class', 'imgWrapp');
        foreach ($imgNodes as $img) {
          $wrapper->appendChild($img->cloneNode(true));
        }
        $newBody->appendChild($wrapper);
      } else {
        $newBody->appendChild($node->cloneNode(true));
      }
    } else {
      $newBody->appendChild($node->cloneNode(true));
    }
  }

  $body->nodeValue = '';
  $body->appendChild($newBody);

  $new_content = '';
  foreach ($body->childNodes as $child) {
    $new_content .= $dom->saveHTML($child);
  }

  return $new_content;
}
add_filter('the_content', 'wrap_aligned_images_preserve_position');

cssでimgWrappにflexboxを適用する
画像は最大横幅270pxを設定してwidth:100%でレスポンシブにも対応させる

/* 回り込み画像の処理ここから */
#main #singlePosts .imgWrapp {
  display: flex;
  gap: 10px;
  width: 100%;
}
#main #singlePosts img.alignleft,
#main #singlePosts img.alignright,
#main #singlePosts img.aligncenter {
    max-width: 270px;
    width: 100%;
    margin: 0;
    float: none;
}
/* 回り込み画像の処理ここまで */

サイト内検索

カテゴリー

最近の投稿

↑上に戻る