「WordPress」の版間の差分
Gnusocialjp (トーク | 投稿記録) (add_filter) |
Gnusocialjp (トーク | 投稿記録) (Message) |
||
22行目: | 22行目: | ||
* [https://web.gnusocial.jp/post/2023/10/13/8867/ 報道: WordPressの公式ホスティングサービスWordPress.comのActivityPub対応] | * [https://web.gnusocial.jp/post/2023/10/13/8867/ 報道: WordPressの公式ホスティングサービスWordPress.comのActivityPub対応] | ||
== Function == | == Function == | ||
317行目: | 306行目: | ||
} | } | ||
add_filter("pmproap_all_access_levels", "my_pmproap_all_access_levels", 10, 3); | add_filter("pmproap_all_access_levels", "my_pmproap_all_access_levels", 10, 3); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===== Message ===== | |||
pmpro_non_member_text_filter/pmpro_not_logged_in_text_filterを[https://github.com/strangerstudios/pmpro-addon-packages/blob/dev/pmpro-addon-packages.php#L266 pmproap_pmpro_text_filter]で上書きしている。この実装を参考に、自分で元のフィルターを上書きすれば、表示文を変更できる。 | |||
<nowiki><div class="pmpro_content_message"><p>This content requires that you purchase additional access. The price is ¥220 or free for our Gold members.</p></nowiki><nowiki><p><a href="https://web.gnusocial.jp/member/checkout/?level=1&amp;ap=10307">Purchase this Content (¥220)</a></nowiki> <nowiki><a href="https://web.gnusocial.jp/member/level/">Choose a Membership Level</a></nowiki><nowiki></p></nowiki><nowiki></div></nowiki> | |||
Addon Package有無の両方の考慮が必要でちょっと複雑になる。 | |||
===== Shortcode ===== | ===== Shortcode ===== | ||
[pmpro_addon_packages] のショートコードを使うと、単品販売の記事一覧を出力できる。 | [pmpro_addon_packages] のショートコードを使うと、単品販売の記事一覧を出力できる。 |
2024年2月26日 (月) 17:11時点における版
About
WordPressは世界の多くのウェブサイトで使用されているCMSだ。PHPで記述されている。
WordPressの外観や挙動はPHPのプログラムを書いてカスタマイズできる。また、プラグイン機構を持ち、世界中の開発者によるプラグインを導入することで簡単にウェブサイトを拡張できる。
Install
WordPress.comなどのホスティングサービスを使用することもできるが、レンタルサーバーやVPSに設置することが好ましい。
ActivityPub
WordPressはActivityPubを実装している。WordPressへの投稿時に分散SNSにも投稿される、分散SNSからWordPressの投稿にコメントできるなどの機能がある。
WordPressの公式ホスティングサービスであるWordPress.comもActivityPubに対応している。分散SNSの中でも巨大なサーバーと言え、無視できない存在だ。
Function
Comment
Ref:
- コメントフォームの項目の文言変更と削除 | immature
- WordPress のコメントフォームを functions.php を使ってカスタマイズする
- comment_form() – Function | Developer.WordPress.org
このあたりの関数で定義されている。フィルターを挟むことで変更できる模様。
PV
WordPressでPV数を表示させる方法がいくつかある。
- 【WordPress】WordPressで人気記事を表示させるプラグイン5選! | 現役マーケターが教える未来のマーケターのためのマーケティングブログ | nukoblog
- WP-PostViewsプラグイン
- WordPress Popular Postsプラグイン
- Post Views Counter: (記事のアクセス数がわかるプラグインのPost Views Counter | たひろブログ)
WP-PostViewsプラグインのほうが柔軟性がある? (WordPressで記事ランキングを設置するならWP-PostViewsが最適なのでは? | kanae-design-works、「WP-PostViews」と「WordPress Popular Posts」の違い | クロジカ)。
WordPressの分析プラグインはDBにアクセ格納するから重くなるらしい
- Google Analytics APIを使ってWordPressの記事をランキング表示させる方法 | Tips Note by TAM
- WordPressのアクセスカウンターを変更しようとしたら思いの外苦労しました | ロードバイク好きの独り言
- Jetpack(WordPress.com)の統計情報を使ってカスタマイズし放題な人気記事ランキングを表示する - 株式会社アップシェア ブログ
- うちはJetpackの機能でPV表示に切り替えました
Jetpackの統計情報から閲覧数を取得表示することができる。これが一番手っ取り早い気がする。
<p>
<?php // 全体、月別、週別、日別のPV表示
global $post;
$views_all = 0;
$views_monthly = 0;
$views_weekly = 0;
$views_daily = 0;
//Jetpack利用時
if (is_jetpack_stats_module_active()) {
$jetpack_views = stats_get_csv( 'postviews', array('days' => -1, 'limit' => 1, 'post_id' => $post->ID ));
if (isset($jetpack_views[0]['views'])) {
$views_all = $jetpack_views[0]['views'];
}
$jetpack_views = stats_get_csv( 'postviews', array('days' => 30, 'limit' => 1, 'post_id' => $post->ID ));
if (isset($jetpack_views[0]['views'])) {
$views_monthly = $jetpack_views[0]['views'];
}
$jetpack_views = stats_get_csv( 'postviews', array('days' => 7, 'limit' => 1, 'post_id' => $post->ID ));
if (isset($jetpack_views[0]['views'])) {
$views_weekly = $jetpack_views[0]['views'];
}
$jetpack_views = stats_get_csv( 'postviews', array('days' => 1, 'limit' => 1, 'post_id' => $post->ID ));
if (isset($jetpack_views[0]['views'])) {
$views_daily = $jetpack_views[0]['views'];
}
}
echo '<span class="daily">日:<span class="pv-count">', $views_daily, '</span></span>';
echo '<span class="weekly">週:<span class="pv-count">', $views_weekly, '</span></span>';
echo '<span class="monthly">月:<span class="pv-count">', $views_monthly, '</span></span>';
echo '<span class="all">全体:<span class="pv-count">', $views_all, '</span></span>';
?>
</p>
上記コードをウィジェットに貼り付けたらうまくいった。
Language
WordPressで多言語対応サイトも構築できる。
情報源:
いろいろ方式があるが、サブディレクトリー形式が手軽な感じがする。
英語で情報発信できると、かなりの数のユーザーにアプローチできる。単に機械翻訳にするだけでも検討する価値はあるだろう。
広告ブロッカー対策
出典: 【WordPress編】広告ブロッカーからサイトコンテンツと収益を守る! | SEの良心。
[CHP Ads Block Detector] というプラグインで実現できるらしい。
「プラグイン: WordPressの広告ブロッカー対策CHP Ads Block Detector | GNU social JP Web」の通り、簡単にできた。
Widget内でのPHP実行
「WordPressのウィジェットでPHPコードを実行する方法 – FOXWP」
function widget_text_exec_php( $widget_text ) {
if( strpos( $widget_text, '<' . '?' ) !== false ) {
ob_start();
eval( '?>' . $widget_text );
$widget_text = ob_get_contents();
ob_end_clean();
}
return $widget_text;
}
add_filter( 'widget_text', 'widget_text_exec_php', 99 );
上記コードをfunction.phpに配置すると、テキストウィジェット内でPHPコード<?php ?>を実行できる模様。
Linkage
WordPressの記事・投稿を他のSNSに自動投稿する方法がいくつかある。
- WordPress 記事をSNSへ自動投稿するベストなプラグイン5選 | 新宿のホームページ制作会社 ITTI(イッティ)
- Jetpack Social connection: Jetpackの機能の一つ。Mastodon/Facebook Page/Instagram Businessアカウントが対象。FacebookとInstagramは個人アカウントはそもそも自動投稿できない。30日で30回までしか自動投稿できない。少々回数制限が厳しいかもしれない。他のプラグインを検討したほうがよさそう。
- GNU social Auto post: GNU socialへの自動投稿。
- NextScripts: Social Network Auto-Poster: Instagramだけ有料。
- Blog2Social: Instagramは有料。
- Nelio Content: 「Nelio Contentの使い方:Instagramと連携させる方法 | ワードプレステーマTCD」。Bufferというサービスのアカウント経由でInstagramも可能。Buffer+Nelio Contentの組み合わせがベストに近い。制限の入ったX/Twitterも対応できそう。ただし、投稿画面で [Customize Timeline] の選択が必要。1クリックで3SNSに投稿連携できるなら、気になるものの許容できる手間。
There has been a critical error on this website. Please check your site admin email inbox for instructions.
プラグインを無効にしようと
How to deactivate all plugins when not able to access the administrative menus?
Paid Memberships Pro
About
PMPro。有料会員サービスを実現するプラグイン。
- Advanced Developer Topics: Security, Caching, Redirection & More
- Paid Membership Pro Action and Filter Hooks
- paid-memberships-pro/includes at master · strangerstudios/paid-memberships-pro
ソースコード内のincludes配下の関数は自分でも使用可能。
Free
PMProは基本的に無料で使える模様 (PMPro: Free WordPress Membership Plugin)。サポートを販売している扱いの模様。ログアウトしていないと表示されない。
「Stranger Studios」がGitHubのリポジトリー。ここに全部のアドオンがある。ここからzipファイル類をダウンロードすれば使える。ただし、一部のプラグインは開発者の経験が必要なため、ライセンスキーの購入をsupportとして販売している。開発経験が一切ない人にはGitHubからのインストールもけっこう面倒くさいからそれでうまくGPLの条件を満たしているのだと思われる。
実行自体はライセンスの有無によらず可能。ただし、ライセンスの有無でStripeの決済手数料が変わる。
「Paid Memberships Pro (@paidmembershipspro) – WordPress user profile | WordPress.org」でも公開しているが、これは全部ではない。サードパーティープラグインとの連携用が大半。
Style
「Custom Message for Non-Members on Protected Content」でペイウォールの表示内容・スタイルを制御できる。
金額変更
定期購読で販売していて、登録後に金額を変更したいことがある。
- How to raise prices on recurring memberships? | WordPress.org
- Change Plan price | WordPress.org
- How to to when member already paid ? | WordPress.org
- Change membership level for next payment in recurring subscription | WordPress.org
これは基本的にできない。定期購読は決済サービス側で登録時の金額で固定されるため。
金額を変更したければ、一度キャンセルして、再度チェックアウト・購入してもらうしかない。
既存会員に対しては、更新ではなく、期限を設けて強制的に一度退会させるのがいい。
Restriction
membership short code
Ref: Hide bottom register form when it has membership code block.
Source: paid-memberships-pro/shortcodes/membership.php at dev · strangerstudios/paid-memberships-pro
PMProの基本的なコンテンツ制限の概念がある。
基本は投稿全体を非表示で、excerptで冒頭部分を一部表示これが基本。membershipショートコードはこの逆で、基本全表示で一部だけ非表示。
そもそも仕組みが違う。
だから、カテゴリーで管理していて、一部だけ非表示にしたかったら、末尾にmoreブロックを配置して、membeshipショートコードも使う必要がある。二重に使わないといけない。けっこう面倒くさい。
「Custom Message for Non-Members on Protected Content」がメッセージの変更方法。ただ、制限のロジックを変更できるわけではない。別のフィルターだと思う。
ソースコードを参考に自分で実装するしかないだろう。
message
「Custom Message for Non-Members on Protected Content」に基本的な表示内容やスタイルの設定方法がある。
<div class="pmpro_content_message"> //custom message here </div>
表示部分は上記要素になるのでこのクラスでスタイルをあてる。
.pmpro_content_message {
background: #F1F1F1;
margin: 0 auto;
max-width: 700px;
padding: 15px;
}
他に以下のフィルターが該当するメッセージ表示。
- add_filter( 'pmpro_non_member_text_filter', 'my_pmpro_non_member_text_filter', 5 );
- add_filter( 'pmpro_not_logged_in_text_filter', 'my_pmpro_not_logged_in_text_filter', 5 );
例えば、会員限定の文字数表示などをしたければ、自前でやるしかない。基本は自分で上記フィルターで上書きするのがよい。
例
function my_pmpro_non_member_text_filter( $text ) {
global $post, $post_membership_levels_names;
$count = mb_strlen( $post->post_content, 'UTF-8' ) - mb_strlen( get_the_excerpt(), 'UTF-8' );
$access = pmpro_has_membership_access( $post->ID, null, true );
$text = "<p>残り{$count}文字。続きは" . implode( '/', $access[2] ) . '会員限定。</p><p>Free=0/Bronze=220/Silver=1100/Gold=2200円。</p>'
. '<p><a href="https://web.gnusocial.jp/member/level/">会員登録</a>/'
. '<a href="//web.gnusocial.jp/member/login/">ログイン</a> (<a href="//web.gnusocial.jp/about/member/">About Member</a>)。</p>';
return $text;
}
add_filter( 'pmpro_non_member_text_filter', 'my_pmpro_non_member_text_filter', 5 );
add_filter( 'pmpro_not_logged_in_text_filter', 'my_pmpro_non_member_text_filter', 5 );
Style
ペイウォール (.pmpro_content_message) のスタイルは会員登録の誘発に重要。
有名サービスの例は上記。登録・購入ボタンを大きく押しやすくしている。a要素の他button要素でも実装されている。ここはいろいろ考えてもいいかもしれない。
Analytics
PMProの流入元の記事を分析・特定する方法がある。
GA4を使った一般的なサイト分析になる。有料プラグインでもできる。
Sell
Single
- Addon Packages Add On Plugin for PMPro
- WooCommerce Integration Add On Plugin
- Paid Memberships Pro Integration with WooCommerce – WordPress plugin | WordPress.org
- Sell Paid Newsletters on WordPress単体記事の販売には工夫が必要。
WooCommerceと連携したり、PMProの有料プラグインを使うとか。他にも方法を以前調査したの後日追記する。
理想としては、単品販売と、会員を両立したい。2個以上買うなら会員のほうがいいみたいな。
単品販売の方法。有料アドオン、LearnDash、後はWooCommerce連携など。
Addon Packagesがいい。PMProのAddon Packagesは、まずあるメンバーシップレベルのユーザーに購入権利を与えて、そこから購入する形。
あくまで単品販売で、定期販売はできない。記事別に金額の入力欄が表示されてそれで単品販売する形。悪くない。こちらの理想に近い。単品販売することにした記事は買うしかない。あるメンバーレベルなら買わなくても見れるというようにはできなさそう。いや。1レベルだけ全アクセス可能はできる。
Course
- Paid Memberships Pro Addon for WP Courseware – WordPress plugin | WordPress.org
- Courses for Membership Add On Plugin
- LearnDash Add On Plugin for Paid Memberships Pro
- Paid Memberships Pro for Selling Courses
LearnCashはちょっといまいち。外部のプラグインとの連携。この機能自体はPMProのあるレベルが、LernDashのあるコースにアクセス可能にするだけだから、あまり意味ない。PMProだけでも似たようなことはできる。
Addon Packages
About
- Addon Packages Add On Plugin for PMPro
- strangerstudios/pmpro-addon-packages: Charge for access to specific pages or other post types in WordPress. Requires the Paid Memberships Pro plugin.
記事の単品販売用にAddon Packagesがあるのでこれを試す。このプラグインは将来的にPMPro本体に取り込まれるもので、一時的な解決用という位置づけ。
Usage
インストールしたらpost/page画面に金額設定画面が表示されるので、ここで金額をいれて、[Require Membership] も指定すると単品販売できる。
カテゴリーでのレベル指定は無効。一番レベル低いFreeなどを1個指定すれば、自動的に全部に適用される。レベルの指定が若干使いにくい。カテゴリーで指定できれば楽だった。やむを得ない。PMPro 3で取り込まれたりしないかな。
しないでしょうね。コンテンツの部分非表示と同じで、ページ単位で会員レベルを指定する必要があるのが作りとしていまいち。だがこれに従うしかないか。基本は変えない運用にすればいいのか。
Configuration
- define( '
PMPROAP_EXP_DAYS
', 0 );: 有効期限の設定デフォルト0 (無期限)。基本はデフォルトでOK。 - apply_filters( 'pmproap_all_access_levels', array(), $user_id, $post_id );: 単品購入を無視してアクセスできる神レベル的なものを指定できる。
- apply_filters( 'pmproap_text_level_id', $text_level_id, $post_id, $user_id, $post_levels );: 未ログインユーザー向けの新規購入時に必要なレベルID。
- apply_filters( 'pmproap_supported_post_types', array( 'page', 'post' ) );
- do_action( 'pmproap_action_add_to_package', $user_id, $post_id );
- do_action( 'pmproap_action_remove_from_package', $user_id, $post_id );
pmproap_all_access_levels を使うと、単品購入を無視してアクセスできる神レベル的なものを指定できる。
例えば、最上位だけ除外するとか。金額でレベル指定できればなおよかったがしかたない。
/*
Set levels as "all access levels" so members of these levels will be able to view all Addon Packages.
Requires Paid Memberships Pro and the pmpro-addon-packages plugin.
*/
function my_pmproap_all_access_levels($levels, $user_id, $post_id)
{
//I'm just adding the level, but I could do some calculation based on the user and post id to programatically give access to content
$levels = array(16);
return $levels;
}
add_filter("pmproap_all_access_levels", "my_pmproap_all_access_levels", 10, 3);
Message
pmpro_non_member_text_filter/pmpro_not_logged_in_text_filterをpmproap_pmpro_text_filterで上書きしている。この実装を参考に、自分で元のフィルターを上書きすれば、表示文を変更できる。
<div class="pmpro_content_message"><p>This content requires that you purchase additional access. The price is ¥220 or free for our Gold members.</p><p><a href="https://web.gnusocial.jp/member/checkout/?level=1&ap=10307">Purchase this Content (¥220)</a> <a href="https://web.gnusocial.jp/member/level/">Choose a Membership Level</a></p></div>
Addon Package有無の両方の考慮が必要でちょっと複雑になる。
Shortcode
[pmpro_addon_packages] のショートコードを使うと、単品販売の記事一覧を出力できる。