質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

2回答

4205閲覧

WordPress 特定のページのカスタムフィールドのみ編集権限のあるユーザー

pineappleman

総合スコア26

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2019/08/06 05:29

編集2019/08/06 06:50

概要

WordPressで作成したメディアサイトがあります。
商品ページ(投稿)が複数あります。
そこで
(1) 1商品につき1ユーザーがログインして詳細情報を入れられるようにしたい
(2) 編集ページのカスタムフィールドに記入してもらいたい
(3) 他のあらゆるpost(カスタム投稿など)を見れなくしたい

問題点

(1) 「特定の投稿のみ」編集できる権限のユーザーを作りたい(複数)
(2) 本文記入できないようにしたい
(3) 商品はメインのpost。カスタム投稿他を非表示にする方法は

手応え

ユーザー管理権限をいじればなんとかなるだろうとは感じています。
(2)(3)はfunction.phpで調整できそうですが、(1)がわからない。

試したこと

(1)のユーザー権限について
プラグイン「User Roll Editor」では希望までの絞り込みができませんでした。
似たプラグインもだめでした。(Permission Groups、User Access Manager)
「特定の1投稿のみ」に編集許可を与えるという条件指定を達成する方法が知りたい。
他の方の質問を見ていたら、プラグイン「WP-Members」で会員サイト形式にする方法も可能性を感じましたが、触ったことがなく、そもそもフロントエンドからの編集ができるのか不明。可能ならば手段にこだわりはありません。

こんな私にどうか助言をいただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukikp

2019/08/06 05:50

>各商品に、その担当者が自分で情報を入れる仕組みを構築したいと考えています。 ・担当者をWordPressのユーザー(購読者)にしてログインを許可するのか? ・各商品の担当者はだれがどのように決めるようにしたいのか ・データの登録はフロントエンドで行いたいのか、管理画面内で行わせたいのか など、もうちょっと具体的な流れがあった方が、良きアドバイスができるかもしれません。
pineappleman

2019/08/06 06:50

只今大幅加筆いたしました。 失礼致しました。ご助言ありがとうございます。
m.ts10806

2019/08/06 07:21

回答依頼いただきましたがWordPress本体は専門外なので、WordPressのスコアが高い方に振っていただきたく。
guest

回答2

0

ベストアンサー

自分だったらどうするか、概要だけ書いておきます。
(product投稿タイプと仮定)

【追記】雰囲気が分かるようにしてみました。

・ログインユーザーのみアクセス可能なpage-editlist.phpを用意し、編集専用ユーザーがログインすると、そのページに強制リダイレクトするように設定。
=>省略

・編集専用ユーザーは管理画面に入ろうとしても、page-editlist.phpのページにリダイレクトするように設定。
=>省略

・page-editlist.phpでは、カスタムフィールドで事前に割り振られた担当ユーザーIDを基に、「自分が編集することができる記事リスト一覧(およびリンク)」を表示させ、リンクをクリックするとその製品ページへと飛ぶ。
※カスタムフィールド名をwriter_idとします。

PHP

1<?php 2if( !is_user_logged_in() ) header('Location: ' . get_bloginfo('url') ); 3get_header(); 4?> 5<div class="container"> 6 <h2>あなたが担当する記事リスト</h2> 7<?php 8 $user_id = get_current_user_id(); 9 $args = array( 10 'post_type' => 'product', 11 'posts_per_page' => -1, 12 'meta_query' => array( 13 'relation' => 'AND', 14 array( 15 'key' => 'writer_id', 16 'value' => $user_id, 17 'type' => 'NUMERIC', 18 'compare' => '=' 19 ), 20 ) 21 ); 22 if( $products = get_posts( $args ) ){ 23?> 24 <ul> 25<?php 26 foreach( $products as $p ){ 27?> 28 <li><a href="<?php echo get_the_permalink( $p->ID );?>"><?php echo get_the_title( $p->ID );?></a></li> 29<?php 30 } 31?> </ul> 32<?php 33 } 34?> 35</div> 36<?php 37get_footer();

・single-product.phpでは、ログインユーザーIDとカスタムフィールドで事前に割り振られた担当ユーザーIDが一致している場合、編集させたいカスタムフィールドのフォームパーツを表示させ、編集・保存ができるようにしておく

single-product.php

PHP

1<?php 2 3//通常の製品紹介の下に追記 4$writer_id = get_post_meta( $post->ID, 'writer_id', true ); 5$user_id = get_current_user_id(); 6if( is_user_logged_in() && $user_id == $writer_id ){ 7?> 8<div id="ProductInfoForm"> 9 <h2>商品情報更新</h2> 10 <form name="ProductInfo" id="ProductInfo"> 11 <input type="hidden" name="post_id" value="<?php echo $post->ID;?>" > 12 <?php 13 wp_nonce_field( 'UPDATEPRODUCTINFO'); 14 カスタムフィールドに保存したい項目をフォームで作成 15 ?> 16 </form> 17 <script type="text/javascript"> 18 jQuery(function($){ 19 20 $('#ProductInfo').submit( function(e){ 21 e.preventDefault(); 22 var action = 'update_productinfo'; 23 var $Form = $('#ProductInfo').append('<input type="hidden" name="action" value="' + action + '" >'); 24 $.ajax({ 25 url: '<?php echo admin_url('admin-ajax.php');?>', 26 type: 'POST', 27 data: $Form.serialize(), 28 success: function(msg){ 29 alert('製品が更新されました'); 30 } 31 }); 32 }); 33 ); 34 </script> 35</div> 36<?php 37} 38?>

functions.phpに追記

PHP

1add_action( 'wp_ajax_update_productinfo', 'update_productinfo'); 2function update_productinfo(){ 3 $my_nonce = isset($_POST['_wpnonce']) ? $_POST['_wpnonce'] : null; 4 if( wp_verify_nonce( $my_nonce, 'UPDATEPRODUCTINFO' ) ){ 5 //製品概要についてproduct_descというキーのカスタムフィールドがあったとする 6 $product_desc = filter_input( INPUT_POST, 'product_desc', FILTER_SANITIZE_STRING ); 7 $post_id = filter_input( INPUT_POST, 'post_id', FILTER_SANITIZE_NUMBER_INT ); 8 if( !empty( $product_desc ) ){ 9 return update_post_meta( $post_id, 'product_desc', $product_desc ); 10 } 11 12 } 13 14}

投稿2019/08/06 07:40

編集2019/08/08 04:40
yukikp

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukikp

2019/08/06 07:48

編集専用ユーザーは、購読者でも良いかと思います。
pineappleman

2019/08/08 03:52 編集

間違ってベストアンサーを押してしまいました。 まだ未解決です。 ご回答くださり誠にありがとうございます。 しかし私の未熟な知識では、それぞれの実装方法が不明でイメージを掴みきれません。 もう少し詳しくご教示頂けませんでしょうか。 要点ごとに方法を調べてはみたものの、ひとりでは限界があります。 ・編集専用ユーザーがログインすると、そのページに強制リダイレクト → これはわかりました。 ・page-editlist.phpでは、カスタムフィールドで事前に割り振られた担当ユーザーIDを基に、「自分が編集することができる記事リスト一覧(およびリンク)」を表示させ、リンクをクリックするとその製品ページへと飛ぶ。 → ここがわかりません。 カスタムフィールドとユーザーIDを紐付けるとはどういうことでしょうか。 ・single-product.phpでは、ログインユーザーIDとカスタムフィールドで事前に割り振られた担当ユーザーIDが一致している場合、編集させたいカスタムフィールドのフォームパーツを表示させ、編集・保存ができるようにしておく → ID一致の場合になにかを表示することは私にもできそうです。 疑問なのは、フロントエンドでカスタムフィールドの編集をする点です。どうすればそのようなことができますか?
pineappleman

2019/08/20 04:37

お返事が遅くなり失礼いたしました。 加筆いただいた内容でうまく動作致しました!ありがとうございます! しかし最後の1手でつまずいております。 single-product.php の以下部分をさらに詳しくご教示頂けませんでしょうか? <?php wp_nonce_field( 'UPDATEPRODUCTINFO'); カスタムフィールドに保存したい項目をフォームで作成 ?> この中でフォームを作成する関数を探して見たものの、理解ができず... ご教示頂けますと大変助かります。 何度も申し訳ございません。
pineappleman

2019/08/20 09:37

↑で質問させて頂いた内容ですが、自己解決できました。 本当に、ありがとうございました。 <form name="ProductInfo" id="ProductInfo"> <input type="hidden" name="post_id" value="<?php echo $post->ID;?>" > <?php wp_nonce_field( 'UPDATEPRODUCTINFO'); カスタムフィールドに保存したい項目をフォームで作成 ?> <input id="product_desc" name="product_desc" ?>"> <input type="submit"> </form>
yukikp

2019/08/21 05:07

いやあ、すみません。時間がまとまって空くときにふらっと来て答えて、またしばらくいなくなってしまうというスタイルなので中途半端になってしまいました。 とりあえず解決できたようでなによりでした!
guest

0

もし Advanced Custom Fields を使ってカスタムフィールドを実装しているのであれば、登録したカスタムフィールドを表示する条件として「権限グループ」を追加すれば実現できそうですよ。
イメージ説明

投稿2019/08/06 05:58

hideyuki.motoo

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pineappleman

2019/08/06 06:51

ありがとうございます。それも解決にあたり不可欠な要素です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問