web-dev-qa-db-ja.com

タイトルに基づいてメタボックスからカテゴリを自動的に除外する

学校のPAシステムとして使用されるWebサイトを設計しています。ユーザーは、学校の議会に対応する特定の日付の名前のカテゴリにエントリを投稿します。 1週間に2つのアセンブリがあります。つまり、私のサイトには多くのカテゴリが必要になります。私はユーザーに最近/今後のアセンブリに対応するカテゴリを表示してほしいだけです。私たちのホームページは単にカテゴリのリストであり、私たちのすべてのカテゴリはmm/dd/yyyyフォーマットで命名されているので、私は最近と遠くないアセンブリ(カテゴリ)だけを表示するために次のスクリプトを書きました。

echo '<ul>';
 $categories = get_categories($category_id);

 foreach ($categories as $cat) {
     $category_link = get_category_link($cat);
        if( strtotime($cat->cat_name) < strtotime('-3 days')) { }
        elseif( strtotime($cat->cat_name) > strtotime('+2 months')) { }
        else { echo '<li><a href="' .$category_link. '">' . $cat->cat_name . '</a></li>'; }
 }

 echo '</ul>';

このコードは私のサイトのホームページで実行され、完全に動作します。問題は、Wordpressのサイト管理者のカテゴリメタボックスでも同様のスクリプトを実行したいということです。そのため、ユーザーは次のアセンブリにしか投稿できません。もともと私はwp_terms_checklist関数を私たちのホームページと同じように動作するように修正したいと思っていましたが、運が悪かったです。最近、私はMikeSchinkelのコード をここで発見しました 。私は彼の方法がメタボックスから特定のカテゴリーを除外する能力を既に持っているので、彼の方法は多くの可能性を示すと思う。私は自分の目的のために彼のコードを修正しようとしましたが、2つのスクリプトを組み合わせるのに問題があります。これが私がこれまでに行ったことがある最も近いものです:

add_filter('list_terms_exclusions', 'yoursite_list_terms_exclusions', 10, 2);
function yoursite_list_terms_exclusions( $exclusions, $args) 
{
    global $pagenow;

    foreach (get_categories() as $category) 
    { 
        if( strtotime($category->cat_name) < strtotime('-3 days')) 
        {
            $category->slug = $oldassemblies;
        }
        elseif( strtotime($category->cat_name) > strtotime('+2 months')) 
        {
            $category->slug = $futureassemblies; 
        }
     }

    if (in_array( $pagenow, array('post.php','post-new.php') ) ) 
    {
        $exclusions = " {$exclusions} AND t.slug NOT IN ('$oldassemblies', '$futureassemblies')" ;
    }

    return $exclusions;  
}

理論的には、このコードは機能するはずですが、foreachステートメントとget_categories()関数によってサイトのフロントエンドとバックエンドの両方が中断されます。除外されたカテゴリスラッグを同じ関数で宣言された変数に置き換えることに成功しましたが、これらの変数を自分のルールに関連付けようとするとすぐに、サイトエラーが発生します。私はまだPHPを学んでいて、考えられるコードの組み合わせのあらゆるバリエーションを試してみましたが、まだ問題があります。何か提案がありましたら教えてください。

ありがとう、ジョナサン

注:メタボックスの編集は、私が管理テーマ用に作成している一連の特殊機能の一部です。すべての関数は巨大なifステートメントの中に置かれているので、それらは寄稿者アクセス権を持つユーザーにのみ影響するので、私のコードはサイト管理者には影響しません。

1
user4308

あなたは、PHPにとって非常に新しい問題に取り組むことにしました。 :-)これであなたのゴールに近づくでしょう:

global $wpdb;
if ( in_array( $pagenow, array('post.php', 'post-new.php') ) ) {
    foreach (get_categories() as $category) {
        $cat_time = strtotime($category->cat_name);
        if ( $cat_time < strtotime('-3 days') || $cat_time > strtotime('+2 months') )
            $exclude .= $wpdb->prepare( '%s,', $category->slug );
    }
    $exclude = substr( $exclude, 0, -1 );
    $exclusions = " ($exclusions) AND t.slug NOT IN ($exclude)" ;
}
1
Andy