カテゴリを「wp-admin / post-new.php」に追加する方法は?


9

カテゴリも設定する新しい投稿を作成するためのリンクが欲しい。

私が試してみましたwp-admin/post-new.php?post_category=12wp-admin/post-new.php?cat=12、どちらも働きました。また、カテゴリのIDではなく名前を使用してみました。影響もありませんでした。

デフォルトのカテゴリで新しい投稿へのリンクを作成するにはどうすればよいですか?

回答:


4

GitHubのDave James Millerがこれを釘付けにしてくれました。仕事はどれも私からのものではありません。宣伝どおりに機能するため、彼のコードをplguinにラップして投稿しています。

<?php
/**
 * Plugin Name: Set default category from url parameter
 * Plugin URI:  https://gist.github.com/davejamesmiller/1966543
 * Description: enables you to setup new post links with the post_title, category and tags in the url: <code><a href="<?= esc_attr(admin_url('post-new.php?post_title=Default+title&category=category1&tags=tag1,tag2')) ?>">New post</a></code>
 * Version:     0.0.1
 * Author:      davejamesmiller
 * Author URI:  https://gist.github.com/davejamesmiller
 */

// I used this code to automatically set the default post title, category and
// tags for a new WordPress post based on which link was clicked. It could also
// be tweaked to hard-code the values instead of using request parameters.


add_filter('wp_get_object_terms', function($terms, $object_ids, $taxonomies, $args)
{
    if (!$terms && basename($_SERVER['PHP_SELF']) == 'post-new.php') {

        // Category - note: only 1 category is supported currently
        if ($taxonomies == "'category'" && isset($_REQUEST['category'])) {
            $id = get_cat_id($_REQUEST['category']);
            if ($id) {
                return array($id);
            }
        }

        // Tags
        if ($taxonomies == "'post_tag'" && isset($_REQUEST['tags'])) {
            $tags = $_REQUEST['tags'];
            $tags = is_array($tags) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") );
            $term_ids = array();
            foreach ($tags as $term) {
                if ( !$term_info = term_exists($term, 'post_tag') ) {
                    // Skip if a non-existent term ID is passed.
                    if ( is_int($term) )
                        continue;
                    $term_info = wp_insert_term($term, 'post_tag');
                }
                $term_ids[] = $term_info['term_id'];
            }
            return $term_ids;
        }
    }
    return $terms;
}, 10, 4);

上記の方法を使用するとうまく機能しますが、投稿カテゴリに依存する高度なカスタムフィールド(別の一般的なプラグイン)ルールが正しく読み込まれない(つまり、そのカテゴリのカスタムフィールドが読み込まれない)ように見えます。誰かがこれの回避策を考え出しましたか?
Aphire 2015年

9

にフックしてwp_insert_post、の投稿ステータスauto-draftGETパラメータのURLをテストします。

ただし、最初に、GETパラメーターを取得してサニタイズするヘルパー関数が必要です。

/**
 * Set default category.
 *
 * @wp-hook pre_option_default_category
 * @return  string Category slug
 */
function t5_get_default_cat_by_url()
{
    if ( ! isset( $_GET['post_cat'] ) )
        return FALSE;

    return array_map( 'sanitize_title', explode( ',', $_GET['post_cat'] ) );
}

次に自動ドラフトハンドラー:

add_action( 'wp_insert_post', 't5_draft_category', 10, 2 );

/**
 * Add category by URL parameter to auto-drafts.
 *
 * @wp-hook wp_insert_post
 * @param   int $post_ID
 * @param   object $post
 * @return  WP_Error|array An error object or term ID array.
 */
function t5_draft_category( $post_ID, $post )
{
    if ( ! $cat = t5_get_default_cat_by_url()
        or 'auto-draft' !== $post->post_status )
        return;

    // return value will be used in unit tests only.
    return wp_set_object_terms( $post_ID, $cat, 'category' );
}

これget_default_post_to_edit()は、2番目のパラメータをに$create_in_db設定して呼び出された場合にのみ機能しTRUEます。他のケースをキャッチするには、オプションをフィルタリングする必要がありますdefault_category

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

これで、パラメーターpost_catを使用して、カテゴリースラッグのコンマ区切りリストを渡すことができます。

ここに画像の説明を入力してください

以下も参照してください。


私はfunctions.phpファイルにコードを貼り付けてこの解決策を試しましたが、機能しませんでした。何か不足していますか?関数を呼び出して機能させるようにする必要がありますか?
Jamie

@ジェイミー仕事が曖昧すぎた。:)
fuxia

functions.phpにコードを追加することで、カテゴリを選択すると、上の写真のように文字列の最後にそのパラメーターが追加されると思いました。特定のカテゴリのみにメタボックスを追加しようとしています。次に、$ _ GETを使用して、メタボックスをロードするための正しいカテゴリに属しているかどうかをテストします。私がコードを試して、上の写真の内容を複製しようとしても、何も起こりませんでした。入手したのはwp-admin / post-new.phpだけでした。wp-admin / post-new.php?post_cat = audioを取得しようとしています
Jamie

@Jamieこのコードは逆の働きをします。リンクを手動で作成し(たとえば、電子メールで誰かに送信するため)、コードによって適切なカテゴリが設定されます。リンクは作成されません。
fuxia

1

この例のソースのように、URLにカテゴリのパラメータがある場合は、デフォルトのオプションdefault_categoryを使用してoption_default_categoryこれをフィルタリングできると思います。プラグインとして使用し、テストします。ゼロから書き込み、テストされていません。

URLパラメータはでpost_catあり、次のURLのようにカテゴリを設定できます。 /wp-admin/post-new.php?post_cat=categoryname

<?php
/**
 * Plugin Name: .my Test
 * Plugin URI:  http://bueltge.de/
 * Description: 
 * Version:     0.0.1
 * Author:      Frank B&uuml;ltge
 * Author URI:  http://bueltge.de/
 */
class Set_Default_Cat_From_Url_Param {

    protected static $classobj = NULL;

    public static function init() {

        NULL === self::$classobj and self::$classobj = new self();

        return self::$classobj;
    }

    function __construct() {

        if ( isset( $_GET['post_cat'] ) )
            add_filter( 'option_default_category', array( $this, 'get_category' ) );
    }

    function get_category( $category ) {

        if ( isset( $_GET['post_cat'] ) )
            $category = get_cat_ID( esc_attr( $_GET['post_cat'] ) );

        return $category;
    }

}
add_action( 'load-post-new.php', array( 'Set_Default_Cat_From_Url_Param', 'init' ) );

0

これはすでに答えられていると思いますが、自分のテイクを追加したかったのです。ここで要旨に追加しましたhttps://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857

手間を省くために、コードは次のとおりです。

function set_category () {

    global $post;
  //Check for a category parameter in our URL, and sanitize it as a string
    $category_slug = filter_input(INPUT_GET, 'category', FILTER_SANITIZE_STRING, array("options" => array("default" => 0)));

  //If we've got a category by that name, set the post terms for it
    if ( $category = get_category_by_slug($category_slug) ) {
        wp_set_post_terms( $post->ID, array($category->term_id), 'category' );
    }

}

//hook it into our post-new.php specific action hook
add_action( 'admin_head-post-new.php', 'set_category', 10, 1 );

他のすべてと同様に、/ wp-admin / post-new.php?category = categorynameでトリガーします

参考までに、@ Aphireのような高度なカスタムフィールドを使用している場合、これは機能します。


これは、単純な投稿であれば機能します。post_typeパラメータがある場合は機能しません。これを修正してwp-admin / post-new.php?post_type = wpdmpro?category = mycategory
yurividal

@yurividal残念ながら、現時点では環境を設定していません。メモリがぼやけていますが、WordPressダウンロードマネージャーのコードをざっと見てみると、次のような「カスタム」分類法を使用している可能性があります。組み込みのカテゴリ分類法ですが、そうではありません。
Malcalevak

@yurividalはコメントを終了するつもりはありませんでした。あなたはそうするものとget_category_by_slug機能を調整する必要がありますget_term_by、その後調整wp_set_post_termsを分類wpdmcategoryカスタムを設定します。
Malcalevak

うわー、それは少し複雑に聞こえます、そして私はそのための十分なphpスキルを持っているとは思いません。とにかく、あなたの助けをありがとう、私はそれをさらに掘り下げてみます。
ユリビダル

@yurividal私はそれが可能だろうとは思わないという複雑な、しかし、私は間違いなく、あまりよくPHPおよび/またはワードプレスで開始する気力をくじくようにそれを見ることができました。時間に余裕があるなら、一緒に何かを投げ出そうとします。私の唯一の懸念は、現在それをテストできないことです。そのため、診断の問題が少し複雑になります...
Malcalevak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.