フォーラムへの返信

15件の返信を表示中 - 16 - 30件目 (全488件中)
  • フォーラム: 使い方全般
    返信が含まれるトピック: WPからダウンロードしたファイル名を指定したい
    kimipooh

    (@kimipooh)

    日時は、WordPress 仕様です。
    メディアによってアップロードされたファイルは、年月のフォルダにわけて保存されます。
    これを変更する場合には、WordPress の管理画面より 設定 > メディアにある「アップロードしたファイルを年月ベースのフォルダに整理」のチェックをオフすることです。

    ただし、すでにアップロードしたものは変更できないと思います。
    すでにアップロードされたものは、.htaccess が利用できるなら、リダイレクト(転送)などをつかうか、再度登録し直す(消してアップロードしなおして、登録しなおす)必要があります。

    すでにアップロードしたものは駄目ですが、新規でアップロードしたものについては文字化けしないはずです。
    ただ利用しているシステム(他のプラグイン等)によって駄目な場合もあるかもしれませんので、可能ならテスト環境を構築(WordPressのデモサイト、あるいは同じサイトのクローンとか)してテストしてみるのがよいかと思います。

    フォーラム: 使い方全般
    返信が含まれるトピック: WPからダウンロードしたファイル名を指定したい
    kimipooh

    (@kimipooh)

    WP Multibyte Patch プラグインがインストールされていませんか。

    入っていない場合には、分かりませんが、もしインストールされていて有効の場合、
    https://highfivecreate.com/blog/wordpress/5936.html#i-2
    などにあるように、日本語等マルチバイトのファイル名は、トラブルを避けるために MD5 ハッシュ化されたファイル名になります。

    おそらくはマルチバイトの場合、
    https://runebook.dev/ja/docs/wordpress/functions/sanitize_file_name
    などにあるように WordPress における安全なファイル名にするためのサニタイズが効果がなくなってしまうセキュリティ的な問題(あるいは意図しない動作をする)でそうしているのかもしれません。

    その辺のリスクは自己責任でということなら
    下記を参考にこのプラグインのファイル名の変換機能(サニタイズ)を無効化しておくのがよいかと思います。
    https://webjin.work/how-to-upload-the-file-name-of-the-japanese-in-wordpress/

    kimipooh

    (@kimipooh)

    すでに示されているフックを使って処理することになります。
    それがわからない場合、何かあった場合に対処できなくなるので、このフックについてまずは勉強してみるのがよいかと思います。
    参考サイト
    https://coosy.co.jp/blog/wordpress-hook/
    https://syncer.jp/Web/WordPress/Reference/Function/apply_filters/

    また Contact Form 7 側の正式ヘルプは下記の通りです。
    https://contactform7.com/2015/03/28/custom-validation/

    で、
    https://ja.wordpress.org/support/topic/contact-form-7でメールアドレスのチェックを厳格にしたい/#post-226741
    のリンク先の解決事例のコードをまず読み解くところからしてみます。
    少しリンク先のコードは修正します。

    まずコードは、テーマの functions.php の一番下に追加するという形になります。

    Contact Form 7 は用意したフィルタ「wpcf7_validate_email」と「wpcf7_validate_email*」に対して、wpcf7_text_validation_filter 関数を実行するようにしています。

    modules/text.php:add_filter( ‘wpcf7_validate_email’, ‘wpcf7_text_validation_filter’, 10, 2 );
    modules/text.php:add_filter( ‘wpcf7_validate_email*’, ‘wpcf7_text_validation_filter’, 10, 2 );

    wpcf7_text_validation_filter 関数は、modules/text.phpにあるので、ここでエラーに関するメッセージをだしています。これが参考にする根底の部分です。

    で 「wpcf7_validate_email」と「wpcf7_validate_email*」の意味は、 Contact Form 7におけるタグの違い([email] か [email*] の違い)ということになります。つまり [text] に対してチェックをいれたければ、wpcf7_validate_text を指定せよということですね。

    add_filter(‘wpcf7_validate_email’, ‘wpcf7_validate_email_reject_nonrfcmail’, 11, 2);
    add_filter(‘wpcf7_validate_email*’, ‘wpcf7_validate_email_reject_nonrfcmail’, 11, 2);

    のように記述します。 11 は優先順位であり、デフォルトは10が指定されています。数が多いほうが後から実行されるということです。次の 2 については関数の引数は2つだよという宣言です。
    実際に、wpcf7_text_validation_filter 関数も引数は2つですし、それに合わせて下記の関数も引数を2つにします。

    あとは、$email にメールアドレスが入りますので、条件を分けてください。
    どう分けるかは、is_emailを参考にすればよいでしょう。ただしエラーメッセージの表示は
    $result->invalidate ($tag, “エラーメッセージの内容”);
    となるので、そこだけ気をつければ良いです。

    となると下記のようなコードになるかなぁとは思います(add_filter部分含む)。

    add_filter('wpcf7_validate_email', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    add_filter('wpcf7_validate_email*', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    
    function wpcf7_validate_email_reject_nonrfcmail($result,$tag){
        $tag = new WPCF7_FormTag( $tag );
    
        $email = isset($_POST[$tag->name]) ? trim($_POST[$tag->name]) : '';
    
        if ( strlen( $email ) < 6 ) {
    	$result->invalidate ($tag, "エラーメッセージの内容");
        }
        if ( strpos( $email, '@', 1 ) === false ) {
    	$result->invalidate ($tag, "エラーメッセージの内容");
        }
        // あとは is_email の条件を追加していく
    
        return $result;
    }
    • この返信は2年前にkimipoohが編集しました。
    • この返信は2年前にkimipoohが編集しました。
    kimipooh

    (@kimipooh)

    https://kinsta.com/jp/knowledgebase/installation-failed-could-not-create-directory/
    などにあるように、WordPress をインストールしているサーバーの容量が足りているか確認してみてください。

    もし容量が十分にあいていて作成できないのであれば、一度サーバーの運営に聞いてみるのがよいです。

    kimipooh

    (@kimipooh)

    2つのコードは同一の処理をしていないので、意図と違うことになるのは当然だろうとは思います。

    やりたいこと
    1.ログインユーザーとACFの値(ユーザー)が一致したとき、ログインユーザー名を出力
    2.管理者の場合、この条件分岐は除外(全コンテンツ表示)

    これをしたい場合で、かつ「管理者かどうか」を最初に条件判定させたい場合には

    1. 管理者じゃない場合
     ログインユーザーとACFの値(ユーザー)が一致
      ログインユーザー名を出力
    2. それ以外(管理者の場合)
     ログインユーザー名を出力

    としないといけないのに、実際のコードについては
    1. 管理者じゃない場合
     ログインユーザーとACFの値(ユーザー)が一致
      ログインユーザー名を出力
    2. それ以外(管理者の場合)
     処理しない(出力しない)

    となっています。
    これコードをみているだけでは気づけ無いのであれば、上記のように言葉で丁寧に書いてみる必要があります。
    このあたりを怠ると意図したことになっていない可能性(抜けてしまっている)が生じるためです。
    ですので、

    2. それ以外(管理者の場合)
     ログインユーザー名を出力

    を追加すればよいようには見えますね。

    • この返信は2年前にkimipoohが編集しました。
    kimipooh

    (@kimipooh)

    そのアップロードしたとき、
    string(70) “WordPress recognizes that the file type is [application/octet-stream].”
    などのエラーも出てきませんか。これが、 WordPress が認識したアップロードしたファイルの MIMEタイプになります。先程の JWWもこれでチェックしました。

    kimipooh

    (@kimipooh)

    その条件であれば、最後のコードで問題ないはずです。
    まずはPHPやウェブサーバーのログで何かエラーが出ていないか確認してみてください。
    また
    https://wp.go-sign.info/how-to-enable-wordpress-debug-mode/
    などを参考に WordPressの Debugを有効にしておくのもよいです。

    気になる点としては、最後のコードについて if を閉じる endif が一つ不足しています。
    最後のコードを <?php 等ややこしいところは全部取っ払うと下記のようになります。

    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name'] === $loginuser):
      *ここで出力
    else:
      if(current_user_can( 'administrator' ) ) :
       *ここで出力
      endif; 

    つまり

    //ログインユーザー=ACFの値が一致したとき
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name']=== $loginuser):
    ?>
    <h3><?php echo $loginuser; ?></h3> //コンテンツ
    
    //上記以外で管理者権限のとき
    <?php else:?>
    <?php if(current_user_can( 'administrator' ) ) :?>
    <h3><?php echo $loginuser; ?></h3> //コンテンツ
    <?php endif; ?>
    
    <?php endif; ?>

    にしないと駄目ということですね。

    kimipooh

    (@kimipooh)

    http://sakuzu.morikei.net/anexcise/anexcise.html
    あたりからサンプルデータをダウンロードして、すでにお伝えしている下記の方法で調べました。

    https://ja.wordpress.org/plugins/wp-add-mime-types/
    上記のFAQにある「メディアからアップロードしたファイルの種類を確認する方法」を参考にしてみてください。

    結果としては application/octet-stream と認識したので、下記の設定をすればアップロード可能なはずです。

    jww = application/octet-stream

    kimipooh

    (@kimipooh)

    Welcart が PHP7以上でないと動作しなくなっており、
    さくらサーバーで PHP7にできないのであれば、
    usces_is_login
    が使えないということになります。

    Welcartプラグインが不要だということであれば、
    そもそも header.php のusces_is_loginも不要だということかもしれません。
    そこはテーマについて、
    https://www.welcart.com/about/
    にあるものを使っているなら、そちらに聞いてみるのが良いかなと思います。
    *その関数があることが前提で何か処理をしているわけで、そこの全容がわからないことには修正できないためです。

    kimipooh

    (@kimipooh)

    最後にお示しのコードはやりたいことが、これまでのコードと変わっています。
    これらを自然言語で書き出すと次のようになります。

    従来
    管理者ではない場合に限定して
    ACFのユーザー名 と ログインしているユーザが一致するなら、
    ログインユーザー名を出力

    最後のコード
    1. ACFのユーザー名 と ログインしているユーザが一致する場合、
       ログインユーザー名を出力
    2. 一致しない場合、かつ管理者である場合
       ログインユーザー名を出力

    従来は、管理者でない場合に限定していますから、「2」は対象外だったということになります。
    つまり、従来のコードであれば管理者だといかなる場合も出力しないということになっています。

    そのため、まずは何をしたいのかを言葉で書き下すところからやってみるのが良いと思います。

    たとえば最後のコードで、管理者かどうかを先に判定したいなら
    1. 管理者の場合
      ACFのユーザー名 と ログインしているユーザが一致しない場合
         ログインユーザー名を出力
    2. 管理者でない場合
      ACFのユーザー名 と ログインしているユーザが一致する場合、
         ログインユーザー名を出力

    となります。ただ、あまりコードの整理はできているわけじゃないので、再度のコードで十分のような気もします。
    きになるのは、管理者の場合、一致しなくても出力してもいいのではないかなぁとは思います。ただこのあたりは、どういう意図をもってやりたいのかわからないので、あくまで感想ではあります。

    kimipooh

    (@kimipooh)

    なぜ停止されたのか状況は分かりませんが、
    念の為バックアップをとった上で、Welcartプラグインを更新する。すでに最新版であれば、一旦削除してインストールしなおしてみるとよいかなと思います。

    kimipooh

    (@kimipooh)

    <?php if (usces_is_login()) { ?>

    https://www.welcart.com/documents/archives/functions/usces_is_login
    をみると、Welcard e-Commerce プラグイン(https://ja.wordpress.org/plugins/usc-e-shop/) が提供する独自関数のようです。

    手持ちでも、Welcard e-Commerce をインストールして有効化していれば、上記はエラー出ませんでしたが、無効にすると、同様に
    Fatal error: Call to undefined function usces_is_login()
    のエラーがでました。

    このことから、上記プラグインが正常に動作しないない可能性があります。
    これがうまく動作しているのであれば、今度はテーマの何かが問題になっている可能性があります。

    いずれも
    https://www.welcart.com/about/
    が影響しているテーマやプラグインであれば、そちらに問い合わせてみるのがよいかなと思います。

    kimipooh

    (@kimipooh)

    そうなってくると、ログイン中のユーザーの権限をなぜ取得できないかを調べる必要があるかなと思います。
    https://wemo.tech/722 
    を参考に、wp_get_current_user 関数で取得可能な情報のうち、管理者かどうかのデータをチェックしてみてください。

    $current_user = wp_get_current_user();
    var_dump($current_user->caps[“administrator”]);

    として、bool(true) という結果が表示されるかどうかです。
    これが表示されるのであれば、

    <?php 
    $current_user = wp_get_current_user();
    if($current_user->caps["administrator"] === false): ?>
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    if($user['display_name']=== $loginuser):
    ?>
    <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>
    <?php endif; ?>

    が使えるということになります。

    • この返信は2年前にkimipoohが編集しました。
    kimipooh

    (@kimipooh)

    管理者かどうかは、現在ログイン中のユーザーの権限をチェックする current_user_can 関数が WordPress によって用意されています。その関数自体はお使いのようですが、もしかしたら administrator の指定をつかうことでうまくいかない可能性があります。一度 manage_options (管理者モードで管理画面にアクセスできる権限)

    利用方法は、https://webgaku.net/jp/wordpress/check-administrator/ のほうでもわかりやすく説明されているかと思います。

    これを利用すると下記のコードになります。

    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    if($user['display_name'] === $loginuser && !current_user_can('manage_options')):
    ?>
    <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>
    kimipooh

    (@kimipooh)

    $loginuser に入ってほしいユーザー名については、現在 WordPress にログインしているユーザーでしょうか。
    もしそうなら、
    $loginuser = wp_get_current_user()->user_login;
    で現在ログインしているユーザーのユーザ名を取得できます。

    つまり

    <?php
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    
    if($user['display_name'] === $loginuser) : ?>
        <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>

    といったコードになるだろうと思います。

    全ユーザーから、ACFで設定したユーザーが存在する場合については

    $user = get_field('username');
    $user_args = array(
      'orderby'=>'ID',
      'order'=>'ASC',
    );
    $user_list = get_users($user_args); // 全ユーザのリストをオブジェクト形式で取得した上で、
    
    $loginuser = ""; // 全ユーザーから、ACFのユーザー名に一致すれば $loginuser にユーザー名を入れる
    foreach($user_list as $each_user) :
      if($user['display_name'] === $each_user->user_login) :
         $loginuser = $each_user->user_login;
         break;
      endif;
    endforeach;
    
    // $loginuser に値が入っている(ということは、全ユーザの中に、ACFのユーザーと一致するものがあった)
    if(!empty($loginuser)) : ?>
        <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>

    などのように判定することができるかなと思います。

    • この返信は2年前にkimipoohが編集しました。
15件の返信を表示中 - 16 - 30件目 (全488件中)