フォーラムへの返信

15件の返信を表示中 - 46 - 60件目 (全94件中)
  • フォーラム: 使い方全般
    返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい
    トピック投稿者 d.w.c

    (@dwc-1)

    >Colorful-life. さん
    ありがとうございます。

    'id' => $post->IDの部分は当方の環境では動いていたのですが、正しくないとのことなので修正しました。
    current_time()も使って下記のようにしました。
    ちょっと長いですが、最終形態を下記に残しておきます。

    global $post;
    $private_blog= get_posts(array(
    	'post_type' => 'hogehoge',
    	'numberposts' => -1,
    	'post_status' => 'private',
    	'tax_query' => array( //非表示タクソノミーを付けたものは除外
    		'relation' => 'AND',
    		array(
    			'taxonomy' => 'blog_hide',
    			'field'    => 'slug',
    			'terms'    => 'hide_this_blog',
    			'operator' => 'NOT IN',
    		)
    	),
    ));
    
    if ( $private_blog ) {
    	foreach ( $private_blog as $post ):
    		setup_postdata($post);
    		$post_time = strtotime($post->post_date);
    		$edit_time = strtotime($post->post_modified);
    		$key_time  = strtotime( '-30 min', current_time( 'timestamp' ));
    		
    		if ( empty($edit_time) )
    			$edit_time = $post_time;
    		
    		if ( $edit_time <= $key_time ) {
    			// データベースにある投稿を公開に変更する
    			$my_post = array(
    				'ID'          => $post->ID,
    				'post_status' => 'publish'
    			);
    			wp_update_post( $my_post );
    		}
    	endforeach;
    	wp_reset_postdata();
    }

    ちなみにwp_cronを使う方法というのは、こんな感じで方向的にはあってるんでしょうか?

    if ( (!wp_next_scheduled( 'blog_cron_event' )) && ($post->post_type == 'hogehoge') && ( $post->post_status == 'private' ) && ( 投稿or編集されたとき?? ) ) {
        wp_schedule_single_event( time() + 1800,'blog_cron_event'); //今から30分後
    }
    function blog_publish_cron() {
    	$my_blog_post = array('ID' => $post->ID, 'post_status' => 'publish');
    	wp_update_post( $my_blog_post );
    }
    add_action( 'blog_cron_event', 'blog_publish_cron' );
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    フォーラム: 使い方全般
    返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい
    トピック投稿者 d.w.c

    (@dwc-1)

    >LABEさん

    すごくすっきりしていますね!
    ありがとうございます。

    >header.php のことでしょうか。
    そうです。

    >wp_cronという仕組みを使えば
    ちょっと見てみたのですが、理解に時間がかかりそうなので次回必要そうなときに再度調べながらやってみます。参考になります。

    >こういう文字列の比較って
    過去にどこかから引っ張ってきたコードを参考に作ったので出典を忘れてしまいまして…調べたらこんなのがあったので文字列でも比較できるとは思うのですが…

    教えていただいた方法の方が動作も確実で早いとのことでしたので、書き換えました。
    ありがとうございました。

    フォーラム: 使い方全般
    返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい
    トピック投稿者 d.w.c

    (@dwc-1)

    ちょっと思いついたのですが、functions.phpではなく、全ページ共通で表示している<body>内のヘッダーエリアに下記を書いてみたところ、目的の動作をするようになりました。

    <?php ////非公開ブログを公開に変更////
    global $post;
    $private_blog= get_posts(array(
    	'post_type'   => 'hogehoge',
    	'numberposts' => -1,
    	'post_status' => 'private'
    ));
    
    if($private_blog){
    	foreach($private_blog as $post):setup_postdata($post);
    		date_default_timezone_set('Asia/Tokyo');
    		$post_time = get_the_time('Y/m/d H:i:s');
    		$edit_time = get_the_modified_time('Y/m/d H:i:s');
    		$key_time  = date('Y/m/d H:i:s', strtotime('-30 min'));
    		
    		if (empty($edit_time)) {
    			$target_time = $post_time;
    		} else {
    			$target_time = $edit_time;
    		}
    		
    		if ($target_time <= $key_time){
    			// データベースにある投稿を公開に変更する
    			$my_post = array(
    				'id'          => $post->ID,
    				'post_status' => 'publish'
    			);
    			wp_update_post( $my_post );
    		}
    	endforeach;
    	wp_reset_postdata();
    }
    ?>

    この方法でも大丈夫でしょうか?
    何か問題があれば教えていただきたいです。

    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    フォーラム: 使い方全般
    返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい
    トピック投稿者 d.w.c

    (@dwc-1)

    >LABEさん
    >Colorful-life.さん
    返信が遅くなってすみません。

    >>非公開の記事を公開状態にする為の要件定義をはっきりさせたほうが良い

    目指す形として
    1.「投稿者」に設定してあるユーザーがカスタム投稿タイプにブログを投稿する。
    2.「投稿者」はログイン後も管理画面にはアクセスできず、ACFプラグインで作成したフロントエンド側から投稿できる仕組みacf_form()を利用してブログを書く。
    3.ブログ投稿フォームにアクセスしようとすると自動で白紙の下書きが作成・保存される。
    4.「投稿者」が記事を書いて投稿ボタンを押すと下書きから非公開に変更される。
    5.非公開化から30分後に公開される。
    6.公開されている記事をacf_form()経由で編集すると再度非公開に変更される。
    7.編集後30分で公開される。

    現在5と7で詰まっています。
    投稿or最終編集時刻と現在時刻を比べて条件分岐させようと思っています。

    ===

    acf_form()で投稿しようとするとプレビュー操作ができないので、いったん非公開で投稿して記事を確認後、必要なら修正をするための時間として30分間を用意したいと思っています。
    「投稿者」は自分の非公開記事はフロントエンドから見れるようにしています。(管理画面にアクセスできないため)

    >Colorful-life.さん >>補足
    にわかなので、基本的なことがすこっと抜けてたりします。すみません…
    わからないことはその都度調べてコードを書いている状況です。

    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    • この返信は6年、 10ヶ月前にd.w.cが編集しました。
    フォーラム: 使い方全般
    返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい
    トピック投稿者 d.w.c

    (@dwc-1)

    >Colorful-life. さん
    調べていただいてありがとうございます。

    こんな感じでしょうか?

    function blog_post_publish( $query ) {
    	if ( false === is_admin() && true === $query->is_main_query() && true === $query->is_single() ) {
    		if ( true === isset($query->query_vars['post_type']) && 'hogehoge' === $query->query_vars['post_type'] && true === isset($query->query_vars['name']) ) {
    			$post = get_page_by_path($query->query_vars['name'], 'OBJECT', $query->query_vars['post_type']);
    			if ( true === empty($post) )
    				return;
    			// 以降、必要な処理を
    			
    			$post_id = $post->ID;
    			$my_blog_post = array('id' => $post_id, 'post_status' => 'publish');
    			wp_update_post( $my_blog_post );
    		}
    	}
    }

    これだと動かないようです・・・。

    $post_id = $post->ID;
    $my_blog_post = array('id' => $post_id, 'post_status' => 'publish');
    wp_update_post( $my_blog_post );

    の部分も間違ってますでしょうか?

    トピック投稿者 d.w.c

    (@dwc-1)

    自己解決しました。
    一応、記録しておきます。

    <?php //post-hoge.php
    $post_id = get_the_ID();
    $search_target_title = get_field('search_target_title');
    $title = get_the_title();
    
    if ( $search_target_title != $title ) {
    	update_post_meta( $post_id, 'search_target_title', $title ); 
    }
    ?>
    <?php //search.php
    if($s){
        $metaquerysp[] = array(
                array(
                    'key' => 'search_target_title',	//投稿タイトルをコピーして格納
                    'value' => $s, "compare" => "LIKE"
                ),
                array(
                    'key' => 'hogehoge',		//検索対象のメタキー
                    'value' => $s, "compare" => "LIKE"
                ),
                array(
                    'key' => 'hugahuga',		//検索対象のメタキー
                    'value' => $s, "compare" => "LIKE"
                ),///好きなだけ検索対象を増やす///
                'relation'=>'OR'
            );
    }
    
    $search_post = get_posts( array(
    	'tax_query' => $taxquerysp,
    //	 's' => $s,                  //削除
    	'meta_query' => $metaquerysp,
    	'posts_per_page' => -1,
    	'post_type' => 'hoge',       //カスタム投稿タイプ「hoge」内から選択
    	'orderby'   => 'meta_value',
    	'meta_key'  => 'time_stamp', //カスタムフィールド「time_stamp」順で表示
    	'order'     => 'desc'
        )
    );
    ?>

    's' => $sを残しておくといろいろ面倒だったので削除し、タイトル格納用のカスタムフィールドを新規で作成し、
    投稿ページのテンプレートにupdate_post_metaを設置して自動でタイトルを格納する仕組みを追加しました。
    自分はエディター内には何も書いてないのでそこに対する処理は無視してます。

    あとは$metaquerysp[]に検索対象にしたいカスタムフィールドをぶっこんで完成です。

    トピック投稿者 d.w.c

    (@dwc-1)

    トピック投稿者 d.w.c

    (@dwc-1)

    <input>にalt属性を付けて、jsで呼び出しているテキストのターゲットをvalueからaltに切り替えることで解決できました。
    検索機能の関係でvlueにタクソノミーのスラッグを指定しているので、valuをターゲットにしているjsでスラッグを拾ってくるのは当たり前でした…orz

    [html]
    <label>
    	<input type="checkbox" class="post_tag_campaign" name="post_tag_campaign[]" value="<?php echo $taxonomy->slug; ?>" alt="<?php echo $taxonomy->name; ?>"<?php if($key_campaign){ echo ' checked'; } ?>>
    	<?php echo $taxonomy->name; ?>
    </label>
    [js]
    $Output_language.innerHTML += $post_tag_language[$i].alt + ' ';
    • この返信は7年前にd.w.cが編集しました。
    • この返信は7年前にd.w.cが編集しました。
    • この返信は7年前にd.w.cが編集しました。
    • この返信は7年前にd.w.cが編集しました。
    フォーラム: 使い方全般
    返信が含まれるトピック: 【js】prependで挿入したタグがそのまま出力される
    トピック投稿者 d.w.c

    (@dwc-1)

    単純にvar $Output_language = document.getElementById( "Output_language" );var $Output_language = $('#Output_language');に差し替えてみましたが、その場合はエラー$ is not a functionとなって動かないようです。

    jsを使って<div>を挿入したかったのは、出力先の中身が空の場合は項目表示欄自体を表示させたくなかったからなのですが、
    最初から<div>をhtmlで書いておいてdisplay: none;などで調整すればいいことに今になって気が付きました。
    その方向で頑張ってみたところ、下記の感じでできました。

    [js]
        var $post_tag_language = document.getElementsByClassName("post_tag_language");
        var $Output_language = document.getElementById( "Output_language" );
        var $Output_language_wrap = document.getElementById( "Output_language_wrap" );
        
        if (($post_tag_language != null) && ($Output_language != null)) { $Output_language.innerHTML = ''; 
            for(var $i = 0; $i<$post_tag_language.length;$i++) { 
                if($post_tag_language[$i].checked) {
                    $Output_language.innerHTML += $post_tag_language[$i].value + ' ';
                }else{
                    //何もしない
                }
            }
            if ($Output_language.innerHTML != '') {
                $Output_language_wrap.className="checked";
            } else {
                $Output_language_wrap.className="blank";
            }
        }
    
    [HTML]
    <div id="sOutput">
    	<div id="Output_language_wrap">
    		<h3>Here!</h3>
    		<span id="Output_language"></span>
    	</div>
    </div>
    
    [CSS]
    #sOutput .blank {
    	display: none;
    }
    #sOutput .checked {
    	display: block;
    }

    前スレ「絞り込み検索でチェックしているものを別枠に即表示させたい」の方にいただいた、呼び出した時の表示名の変更についてはこのあと試させていただきます。

    jsについての質問掲示板などでお勧めの場所があれば教えていただけると幸いです。
    ありがとうございます。

    • この返信は7年前にd.w.cが編集しました。
    • この返信は7年前にd.w.cが編集しました。
    • この返信は7年前にd.w.cが編集しました。
    トピック投稿者 d.w.c

    (@dwc-1)

    >LABE さん

    いろいろ考えてくださり、ありがとうございます。
    以前参照元のリンクを複数挿入してスレッドを立ち上げたところ、スパムと判定されて投稿できなかったことがあったので外部リンクに神経質になっていました。
    すみません。

    選択されているタクソノミーのスラッグを拾ってきてしまう件については現状ではまだ解決していません・・・

    トピック投稿者 d.w.c

    (@dwc-1)

    自力解決できました。
    <input>にclassを付け、jsの方ではこのclassを利用して対象を特定するように書き換えてみたところ、動きました。

    これで正解かはわかりませんが…

    [HTML]
    <input class="post_tag_language" type="checkbox" name="post_tag_language[]" value="<?php echo $taxonomy->slug; ?>"<?php if($key_language){ echo ' checked'; } ?>><?php echo $taxonomy->name; ?>
    [js]
    window.onload = function () {
        getValue();
        var $formObject = document.getElementById( "searchform" );
        for( var $i = 0; $i < $formObject.length; $i++ ) {
            $formObject.elements[$i].onkeyup = function(){
                getValue();
            };
            $formObject.elements[$i].onchange = function(){
                getValue();
            };
        }
    };
    function getValue() {
        var $formObject = document.getElementById( "searchform" );
        var $post_tag_language = document.getElementsByClassName("post_tag_language"); 
    
        //input[name=text]
        document.getElementById( "OutputText" ).innerHTML = $formObject.s.value;
    
        //input[name=checkbox] ※自力
        document.getElementById( "Output_lang" ).innerHTML = ''; //いったん中身を削除
            for(var $i = 0; $i<$post_tag_language.length;$i++) { //複数checkedされていることもあるので、forでまわす(まわさないと1番目のしか取れない)
            if($post_tag_language[$i].checked) {
                document.getElementById( "Output_lang" ).innerHTML += $post_tag_language[$i].value + ' ';
            }
        }
    }
    • この返信は7年前にd.w.cが編集しました。
    トピック投稿者 d.w.c

    (@dwc-1)

    >フォームの動作を読み込みなしに別の要素に反映させたいという意図で選択されたものかな
    その通りです。

    >引き渡したい要素は数量が変更になる(テキストボックスの個数がユーザーの都合によって増減する)ことがあるものでしょうか。
    はい、数量変更の可能性があります。

    ===

    現状、このサンプルのコードですとID要素を使用している部分は、取得した情報を反映させる先の <span> タグを指定するためかと思います。

    困っているのは、情報を取得する元の<input>タグを指定するのが $formObject.要素のNAME というところだと思うのですが、
    サンプルでは<input>タグのNAMEは固定なのですが、現在自分が書いているコードではNAMEが配列になっている部分です。

    jsの側でNAMEが配列でも取得できるようにするか、そもそもphp側のNAMEが配列でなくても絞り込み検索が作動するようにできれば解決なのですが…

    • この返信は7年前にd.w.cが編集しました。
    トピック投稿者 d.w.c

    (@dwc-1)

    ためしにphpの方に$iiでカウントを追加してみました。

    		<?php
    		$taxonomy_name = 'tax-language';
    		$taxonomys = get_terms($taxonomy_name);
    		$ii='';
    		if(!is_wp_error($taxonomys) && count($taxonomys)):$ii++;
    		echo '<li class="switch';
    			if($post_tag_language) { echo' open';}//チェックがあればアコーディオン開く
    		echo '">【対応言語】</li>';
    		echo '<li class="contentWrap">';
    		    foreach($taxonomys as $taxonomy):
    			    if($post_tag_language){ $key_language = in_array($taxonomy->slug, $post_tag_language);}//チェック保持用変数
    		        $tax_posts = get_posts(array('post_type' => get_post_type('house'), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
    		        if($tax_posts):
    		?>
    		<label><input type="checkbox" name="post_tag_language[<?php echo $ii ;?>]" value="<?php echo $taxonomy->slug; ?>"<?php if($key_language){ echo ' checked'; } ?>><?php echo $taxonomy->name; ?></label><br>
    		<?php
    		        endif;
    		    endforeach;
    		    echo '</li>';
    		endif;
    		?>

    これでも検索機能は使えるようですが、このあとjsにはどういった変更を加えればいいでしょうか?
    $formObject.post_tag_language[$ii]
    $formObject.post_tag_language[$ii][$i].
    では

    Uncaught ReferenceError: $ii is not defined
        at getValue (search_output.js?ver=4.7.3:21)
        at window.onload (search_output.js?ver=4.7.3:2)

    というエラーになり、
    $formObject.post_tag_language[$i]
    $formObject.post_tag_language[$i][$i].
    では

    Uncaught TypeError: Cannot read property '0' of undefined
        at getValue (search_output.js:21)
        at window.onload (search_output.js:2)

    というエラーになります。

    • この返信は7年前にd.w.cが編集しました。
    トピック投稿者 d.w.c

    (@dwc-1)

    返信ありがとうございます。
    HTMLとJSを分けてみました。

    HTML

    [HTML 既存の絞り込み検索]
    
    <?php 
    $s = $_GET['s'];
    $post_tag_language = $_GET['post_tag_language'];
    ?>
    <form method="get" id="searchform" action="<?php echo home_url( '/' ); ?>" class="kensaku">
    	<input type="hidden" name="post_type" value="house">
    	<p>
    	<div class="search-box">【フリーワード】:
    		<input class="search" type="text" value="<?php if (!empty($_GET['s'])) echo esc_attr($_GET['s']); ?>" name="s" id="s">
    		<button id="searchsubmit" class="btn-search"><img alt="検索" width="32" height="20" src="<?php echo get_template_directory_uri(); ?>/images/icon/icon-btn-search.png"></button>
    	</div>
    	</p>
    	
    <ul id="search" class="accordion">
    		<?php
    		$taxonomy_name = 'tax-language';
    		$taxonomys = get_terms($taxonomy_name);
    		if(!is_wp_error($taxonomys) && count($taxonomys)):
    		echo '<li class="switch';
    			if($post_tag_language) { echo' open';}//チェックがあればアコーディオン開く
    		echo '">【対応言語】</li>';
    		echo '<li class="contentWrap">';
    		    foreach($taxonomys as $taxonomy):
    			    if($post_tag_language){ $key_language = in_array($taxonomy->slug, $post_tag_language);}
    		        $tax_posts = get_posts(array('post_type' => get_post_type('house'), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
    		        if($tax_posts):
    		?>
    		<label><input type="checkbox" name="post_tag_language[]" value="<?php echo $taxonomy->slug; ?>"<?php if($key_language){ echo ' checked'; } ?>><?php echo $taxonomy->name; ?></label><br>
    		<?php
    		        endif;
    		    endforeach;
    		    echo '</li>';
    		endif;
    		?>
    </ul>
    
        <p><input type="submit" value="検索" /></p>
        
    </form>
    ※実際の検索項目はもっとありますが、一部抜粋です。
    
    ===
    
    [HTML 選択中項目出力先]
    
    <div id="sOutput">
        【出力欄】
        <br />
        テキスト:<span id="OutputText"></span>
        <br />
        言語:<span id="Output_lang"></span>
    </div>

    jsファイル

    
    [search_output.js 書き換えたもの]
    
    window.onload = function () {
        getValue();
        var $formObject = document.getElementById( "searchform" );
        for( var $i = 0; $i < $formObject.length; $i++ ) {
            $formObject.elements[$i].onkeyup = function(){
                getValue();
            };
            $formObject.elements[$i].onchange = function(){
                getValue();
            };
        }
    };
    function getValue() {
        var $formObject = document.getElementById( "searchform" );
    
        //input[name=text]
        document.getElementById( "OutputText" ).innerHTML = $formObject.s.value;
    
        //input[name=checkbox] ※自力
        document.getElementById( "Output_lang" ).innerHTML = ''; //いったん中身を削除
            for(var $i = 0; $i<$formObject.post_tag_language.length;$i++) { //複数checkedされていることもあるので、forでまわす(まわさないと1番目のしか取れない)
            if($formObject.post_tag_language[$i].checked) {
                document.getElementById( "Output_lang" ).innerHTML += $formObject.post_tag_language[$i].value + ' ';
            }
        }
    }

    LABEさんのアドバイスとしては、phpの方に書いてあるname="post_tag_language[]"の [] の中に何か記入する必要があるということでしょうか?

    ちなみに、絞り込み検索機能は「絞り込み検索をプラグインを使わずに実装:タグまたはカスタムタクソノミーで絞り込むチェックボックス」
    というのを参考に作成していまして、そこに書かれているコードだと [] の中身は空白のままなので、そのままにしていました。

    • この返信は7年前にd.w.cが編集しました。
    トピック投稿者 d.w.c

    (@dwc-1)

    また、jsの中身が
    document.getElementById( "Output_lang" ).innerHTML += $formObject.post_tag_language[$i].value + ' ';
    だと選択されているタクソノミーのスラッグを拾ってきてしまうのですが、これを名前を拾うようにするにはどう書き換えればいいですか?

    すみません、簡単そうなんですが、調べきれずに相談しています。

    • この返信は7年前にd.w.cが編集しました。
15件の返信を表示中 - 46 - 60件目 (全94件中)