テスト1:新規投稿で任意の6個のタグを付けてみる。
テスト1の結果:タグの数は関係なさそう。
テスト2:コードブロックを使って、その中にハッシュタグと間違えそうなものを入れてみる。
.section-3 { background-color: #27ae60; }
テスト2の結果:再現されました。上記のコードを入れたことで、ID=27のハッシュタグが勝手に追加された。たぶん、記事からハッシュタグを検出するアルゴリズムのバグ。
テスト3:コードブロックに入れたコードと似たコードを記事中に記載してみる。
.section-3 { background-color: #30ae60; }
テスト3の結果:再現されました。上のコードをコードブロックではなく記事中に記載しても、再現。上記の場合は、ID=30のハッシュタグが勝手に追加された。
テスト4:設定の「コンテンツにネイティブタグとしてハッシュタグを追加し、タグリンクで #tag を置き換えます。」のチェックを外して見る。ID=27のタグはサイドバーからチェックを外す。相変わらず記事からハッシュタグを拾うなら、サイドバーのタグ選択のチェックを外しても無駄なはず。
テスト4の結果:勝手に付けられたタグを外すことができた。対処法として、プラグイン ActivityPub の設定の Hashtags 「コンテンツにネイティブタグとしてハッシュタグを追加し、タグリンクで #tag を置き換えます。」のチェックを外して使う。


コメント
includes/constants.php には次のようなコードがあるが、
#1 や #2 は前後に半角スペースがあるなどすればマッチするが、
.section-3 { background-color: #27ae60; }
から #27 を拾うことはないらしい。拾うとしたら #27ae60 らしい。
だから、#1や#2がハッシュタグ扱いされてしまった問題と、このテストで#27がハッシュタグ扱いされて、id=27のハッシュタグに変換された問題は、別かもしれない。
WordPressのデフォルトの機能として、数字をタグにすることができる。
だから、ハッシュタグを見つけるコードで#1や#2をピックアップしてタグにしてしまうことは、避けようがない。
ピックアップしたハッシュタグが数字だけの場合は、タグにしないような条件を追加して避けることができるかもしれないが、#27ae60;のように「数字で始まる」場合は #1番好きなもの のような場合も含まれてしまうのでダメ。ただ、カラーコードの場合なら、カラーコードの条件を満たした場合はタグにしないような条件を追加することはできる。しかし、その場合、ハッシュタグにしたい場合にハッシュタグにならない問題が生じる。
似たケースとして@で始まると、勝手にメンションと解釈しちゃう問題もある。
結局、どこかで妥協して対処するしかないような気がする。
PHPで
echo intval("27ae60");
を実行したら、結果は
27
になった。
echo intval("30ae60");
なら
30
だから、例えば、
includes/class-hashtag.php
で、ハッシュタグをピックアップして、"27ae60"や"30ae60"がピックアップされた後、intval関数で"27"や"30"にされた後、\wp_add_post_tags関数で、タグをデータベースのテーブルに追加しようとすると、"27"や"30"は"id=27"や"id=30"と認識されて、そのidに相当するタグが、追加される可能性があるのかもしれない。
class-hashtag.phpには
// Skip hashtags in HTML attributes, like hex colors.
とあるが、このテストのように、カラーコードに関してはスキップされなかったらしい。
$content = wp_strip_all_tags( $post->post_content . "\n" . $post->post_excerpt );
では、HTMLタグを削除するだけで、HTMLタグの外にあるカラーコードや#1などのナンバーコードはスキップできない。
"For parameter $terms, integers are interpreted as tag IDs. Some functions may return term_ids as strings which will be interpreted as slugs consisting of numeric characters.
"
wp_set_object_terms() – Function | Developer.WordPress.org
https://developer.wordpress.org/reference/functions/wp_set_object_terms/
Google翻訳
"パラメータ $terms では、整数はタグIDとして解釈されます。一部の関数は、term_ids を文字列として返す場合があり、これは数字からなるスラッグとして解釈されます。"
これだと、"27ae60"は数時から始まるスラッグとして解釈されるはず。
"$terms string|array optional
An array of terms to set for the post, or a string of terms separated by commas. Hierarchical taxonomies must always pass IDs rather than names so that children with the same names but different parents aren’t confused.
"
wp_set_post_terms() – Function | Developer.WordPress.org
https://developer.wordpress.org/reference/functions/wp_set_post_terms/
Google翻訳
"投稿に設定する用語の配列、またはカンマで区切られた用語の文字列。階層型タクソノミーでは、同じ名前で親が異なる子が混同されないように、常に名前ではなくIDを渡す必要があります。"
\wp_add_post_tagsを使った場合、通るのはこっち。
ソースの最後に、
return wp_set_object_terms( $post_id, $terms, $taxonomy, $append );
で、wp_set_object_termsを使ってる。
ソースに次のコードがあり、intval関数が使われている。
if ( is_taxonomy_hierarchical( $taxonomy ) ) {
$terms = array_unique( array_map( 'intval', $terms ) );
}
"Checks to make sure that the taxonomy is an object first. Then Gets the object, and finally returns the hierarchical value in the object.
A false return value might also mean that the taxonomy does not exist.
For more information on this and similar theme functions, check out the Conditional Tags article in the Theme Developer Handbook.
"
is_taxonomy_hierarchical() – Function | Developer.WordPress.org
https://developer.wordpress.org/reference/functions/is_taxonomy_hierarchical/
Google翻訳
"まず、タクソノミーがオブジェクトであることを確認します。次にオブジェクトを取得し、最後にオブジェクト内の階層値を返します。
戻り値が偽の場合、タクソノミーが存在しないことを意味する場合もあります。
この関数や同様のテーマ関数の詳細については、テーマ開発者ハンドブックの条件タグの記事をご覧ください。"