d.w.c
フォーラムへの返信
-
フォーラム: 使い方全般
返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい>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' );
フォーラム: 使い方全般
返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい>LABEさん
すごくすっきりしていますね!
ありがとうございます。>header.php のことでしょうか。
そうです。>
wp_cron
という仕組みを使えば
ちょっと見てみたのですが、理解に時間がかかりそうなので次回必要そうなときに再度調べながらやってみます。参考になります。>こういう文字列の比較って
過去にどこかから引っ張ってきたコードを参考に作ったので出典を忘れてしまいまして…調べたらこんなのがあったので文字列でも比較できるとは思うのですが…教えていただいた方法の方が動作も確実で早いとのことでしたので、書き換えました。
ありがとうございました。フォーラム: 使い方全般
返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したいちょっと思いついたのですが、
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(); } ?>
この方法でも大丈夫でしょうか?
何か問題があれば教えていただきたいです。- この返信は7年、 6ヶ月前にd.w.cが編集しました。
フォーラム: 使い方全般
返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい>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.さん >>補足
にわかなので、基本的なことがすこっと抜けてたりします。すみません…
わからないことはその都度調べてコードを書いている状況です。フォーラム: 使い方全般
返信が含まれるトピック: カスタム投稿の公開状態を自動で変更したい>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 );
の部分も間違ってますでしょうか?
フォーラム: 使い方全般
返信が含まれるトピック: get_postsで全てのカスタムフィールドを検索対象にしたい。自己解決しました。
一応、記録しておきます。<?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[]
に検索対象にしたいカスタムフィールドをぶっこんで完成です。フォーラム: プラグイン
返信が含まれるトピック: 「Search Everything」以外でカスタムフィールドを検索対象にしたいget_postsで全てのカスタムフィールドを検索対象にしたい。
こちらに質問を移しました。フォーラム: 使い方全般
返信が含まれるトピック: 絞り込み検索でチェックしているものを別枠に即表示させたい<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 + ' ';
フォーラム: 使い方全般
返信が含まれるトピック: 【js】prependで挿入したタグがそのまま出力される単純に
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についての質問掲示板などでお勧めの場所があれば教えていただけると幸いです。
ありがとうございます。フォーラム: 使い方全般
返信が含まれるトピック: 絞り込み検索でチェックしているものを別枠に即表示させたい>LABE さん
いろいろ考えてくださり、ありがとうございます。
以前参照元のリンクを複数挿入してスレッドを立ち上げたところ、スパムと判定されて投稿できなかったことがあったので外部リンクに神経質になっていました。
すみません。選択されているタクソノミーのスラッグを拾ってきてしまう件については現状ではまだ解決していません・・・
フォーラム: 使い方全般
返信が含まれるトピック: 絞り込み検索でチェックしているものを別枠に即表示させたい自力解決できました。
<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年、 8ヶ月前にd.w.cが編集しました。
フォーラム: 使い方全般
返信が含まれるトピック: 絞り込み検索でチェックしているものを別枠に即表示させたい>フォームの動作を読み込みなしに別の要素に反映させたいという意図で選択されたものかな
その通りです。>引き渡したい要素は数量が変更になる(テキストボックスの個数がユーザーの都合によって増減する)ことがあるものでしょうか。
はい、数量変更の可能性があります。===
現状、このサンプルのコードですとID要素を使用している部分は、取得した情報を反映させる先の
<span>
タグを指定するためかと思います。困っているのは、情報を取得する元の
<input>
タグを指定するのが$formObject.要素のNAME
というところだと思うのですが、
サンプルでは<input>
タグのNAME
は固定なのですが、現在自分が書いているコードではNAME
が配列になっている部分です。jsの側で
NAME
が配列でも取得できるようにするか、そもそもphp側のNAME
が配列でなくても絞り込み検索が作動するようにできれば解決なのですが…- この返信は7年、 8ヶ月前にd.w.cが編集しました。
フォーラム: 使い方全般
返信が含まれるトピック: 絞り込み検索でチェックしているものを別枠に即表示させたいためしに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年、 8ヶ月前にd.w.cが編集しました。
フォーラム: 使い方全般
返信が含まれるトピック: 絞り込み検索でチェックしているものを別枠に即表示させたい返信ありがとうございます。
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年、 8ヶ月前にd.w.cが編集しました。
フォーラム: 使い方全般
返信が含まれるトピック: 絞り込み検索でチェックしているものを別枠に即表示させたい