私は野球関連のウェブサイトを複数の作者と共に持っています。記事の「編集者の選択」を示すには、「この投稿をフロントページに貼り付ける」を使用します。編集者がフロントエンドからこれを実行できるように、リンク/ボタンを追加したいと思います。このメソッドは、記事自体または管理バーにあります。私は本当に好みがありません。
私は多くの、さまざまな「管理バー」プラグインを調べましたが、「この投稿をフロントページに貼り付ける」に関連するものは見つかっていません。
ありがとう
私はこの小さなソースコードがあなたの解決策だと思います。現時点ではSticky Postの変更に関するフロントエンドのフィードバックはありませんが、この文字列、クラス、または関数fb_stick_post
で必要なものはすべて強化できます。
最初の関数は管理バーにアイテムを追加し、パラメータ値を持つ新しいURLを作成します。また、on click
はUrlパラメータを読み取る関数を呼び出し、それがtrueの場合は、この投稿IDのスティッキステータスへの変更を行います。
add_action( 'admin_bar_menu', 'fb_add_admin_bar_sticky', 35 );
function fb_add_admin_bar_sticky() {
global $wp_admin_bar;
if ( ! is_super_admin() || ! is_admin_bar_showing() )
return;
$current_object = get_queried_object();
if ( empty($current_object) )
return;
if ( ! empty( $current_object->post_type ) &&
( $post_type_object = get_post_type_object( $current_object->post_type ) ) &&
current_user_can( $post_type_object->cap->edit_post, $current_object->ID )
) {
$wp_admin_bar->add_menu(
array(
'id' => 'sticky_post',
'title' => __('Sticky'),
'href' => get_permalink() . '?stick_post=true',
'meta' => array(
'title' => __( 'Click me' ),
'onclick' => fb_stick_post( get_the_ID() )
)
)
);
}
}
function fb_stick_post( $post_id ) {
if ( isset($_GET['stick_post']) && 'true' == htmlspecialchars( $_GET['stick_post'] ) )
stick_post( $post_id );
}
更新日2012年7月30日
今すぐ簡単な解決策と小さなプラグイン。プラグインは管理バーの中に項目を追加します。ボタンチェックの文字列は固定されており、現在の投稿を固定または固定解除することができます。
私はpostのstickフラグを更新した後にリダイレクトを使用するためにadminバー項目を 'template_redirect`に追加するためのフックを変更します。
<?php
/**
* Plugin Name: Stick/Unstick post via Admin bar
*
*/
if ( ! function_exists( 'fb_add_admin_bar_sticky' ) ) {
add_action( 'template_redirect', 'fb_add_admin_bar_sticky' );
function fb_add_admin_bar_sticky() {
global $wp_admin_bar;
if ( ! is_super_admin() || ! is_admin_bar_showing() )
return;
$current_object = get_queried_object();
if ( empty($current_object) )
return;
if ( ! empty( $current_object->post_type ) &&
( $post_type_object = get_post_type_object( $current_object->post_type ) ) &&
current_user_can( $post_type_object->cap->edit_post, $current_object->ID )
) {
// check, if an sticky post
if ( is_sticky( get_the_ID() ) ) {
$title = __('Unsticky');
$link = '?unstick_post=true';
$attr_title = __( 'Make this post unsticky' );
} else {
$title = __('Sticky');
$link = '?stick_post=true';
$attr_title = __( 'Make this post sticky' );
}
$wp_admin_bar->add_menu(
array(
'id' => 'sticky_post',
'title' => $title,
'href' => get_permalink() . $link,
'meta' => array(
'title' => $attr_title,
'onclick' => fb_stick_post( get_the_ID() )
)
)
);
}
}
function fb_stick_post( $post_id ) {
if ( isset($_GET['stick_post']) && 'true' == htmlspecialchars( $_GET['stick_post'] ) ) {
stick_post( $post_id );
wp_redirect( get_permalink( $post_id ) );
exit();
}
if ( isset($_GET['unstick_post']) && 'true' == htmlspecialchars( $_GET['unstick_post'] ) ) {
unstick_post( $post_id );
wp_redirect( get_permalink( $post_id ) );
exit();
}
}
}
/このプラグインをダウンロードする Gist 3214922
ここで便利になるいくつかの機能があります:
unstick_post
- 投稿を固定解除するstick_post
- 投稿を貼り付けるis_sticky
- 投稿がスティッキーかどうかを判断するこれらの3つを念頭に置いて、私たちがする必要があるのはいくつかの管理メニューバー接着剤でそれらをくっつけることだけです。
最初に、楽しさと利益のためにすべてをクラスにラップしましょう。このクラスには、後で使用する定数がいくつかあります。ナンス、投稿を固定解除するためのアクション、および投稿を固定するためのアクションです。
class WPSE_58818_Stick_Post
{
/**
* Ajax nonce.
*
* @since 1.0
*/
const NONCE = 'wpse58818_nonce_';
/**
* Unstick ajax action
*
* @since 1.0
*/
const UNSTICK = 'wpse58818_unstick';
/**
* Stick Ajax action
*
* @since 1.0
*/
const STICK = 'wpse58818_stick';
} // end class
それでは、アクションを追加するためのinit関数を追加しましょう。最初のアクションは、template_redirectにフックすることです。
<?php
class WPSE_58818_Stick_Post
{
// snip snip
/**
* Adds actions and such.
*
* @since 1.0
* @access public
* @uses add_action
*/
public static function init()
{
add_action(
'template_redirect',
array(__CLASS__, 'template_r')
);
}
}
注:これ以降はclass
ビットを省略します。全部を見ることができます ここ 。
template_redirect
にフックされた関数で、私たちが単一の投稿ページにいるかどうか、そしてユーザーがそれを編集できるかどうかを確認します。可能であれば、admin_bar_menu
とwp_footer
にフックします。
/**
* Hooked into `template_redirect`. Adds the admin bar stick/unstick
* button if we're on a single post page and the current user can edit
* the post
*
* @since 1.0
* @access public
* @uses add_action
*/
public static function template_r()
{
if(
!is_single() ||
!current_user_can('edit_post', get_queried_object_id())
) return; // not a single post or the user can't edit it
// Hook into admin_bar_menu to add stuff
add_action(
'admin_bar_menu',
array(__CLASS__, 'menu'),
100
);
// Hook into the footer and spit out some JavaScript
add_action(
'wp_footer',
array(__CLASS__, 'footer')
);
}
admin_bar_menu
にフックされたmenu
関数では、新しい項目を追加することができます。
/**
* Hooked into `admin_bar_menu`. Adds our stick/unstick node.
*
* @since 1.0
* @access public
*/
public static function menu($mb)
{
// get the current post ID
$post_id = get_queried_object_id();
$mb->add_node(array(
'id' => 'wpse58818-sticker',
'meta' => array(
'class' => 'wpse58818-sticker',
'title' => is_sticky($post_id) ? 'unstick' : 'stick'
),
'title' => is_sticky($post_id) ? __('Unstick') : __('Stick'),
'href' => self::get_url($post_id)
));
}
ここで私たちは管理者メニューバーノードのためのURLを構築する私たちの最初の "ユーティリティ関数"を手に入れます。これはadd_query_arg
を囲むだけのラッパーで、後でAJAXと共に使用するURLを作成します。
/**
* Get an Ajax URL to use for a given post
*
* @since 1.0
* @access protected
*/
protected static function get_url($post_id)
{
return add_query_arg(array(
'post_id' => absint($post_id),
'action' => is_sticky($post_id) ? self::UNSTICK : self::STICK,
'nonce' => wp_create_nonce(self::NONCE . $post_id)
), admin_url('admin-ajax.php'));
}
footer
関数はAJAX呼び出しをするためにJavaScriptを吐き出します。基本的な概要:誰かが私たちの新しいリンクをクリックしたら、与えられたURLにGETリクエストをします。成功した場合は、(un)stickリンクのhref、text、およびtitleを変更してください。
/**
* Hooked into `wp_footer`. Spits out a bit of JS to stick/unstick a post
*
* @since 1.0
* @access public
*/
public static function footer()
{
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('.wpse58818-sticker a').on('click', function(e) {
e.preventDefault();
var action = $(this).attr('title');
var that = this;
$.get(
$(this).attr('href'),
{},
function(data) {
if('0' == data)
{
console.log(data);
alert('<?php echo esc_js(__('An error occurred')); ?>');
return;
}
$(that).attr('href', data);
if('stick' == action) {
$(that).html('<?php echo esc_js(__('Unstick')); ?>');
$(that).attr('title', 'unstick');
} else {
$(that).html('<?php echo esc_js(__('Stick')); ?>');
$(that).attr('title', 'stick');
}
}
);
});
});
</script>
<?php
}
そして今度はAJAXコールバックに行きます。 プラグインのAjax /テーマ を読む価値があります。
init
関数を少し修正して、さらに2つのアクションを追加します。
/**
* Adds actions and such.
*
* @since 1.0
* @access public
* @uses add_action
*/
public static function init()
{
add_action(
'template_redirect',
array(__CLASS__, 'template_r')
);
// Ajax actions
add_action(
'wp_ajax_' . self::STICK,
array(__CLASS__, 'stick')
);
add_action(
'wp_ajax_' . self::UNSTICK,
array(__CLASS__, 'unstick')
);
}
そしてAJAXコールバック。これらは非常に簡単に同じ機能である可能性があります。将来拡張したり変更したりする方が簡単だと思われるので、ここでそれらを分割しました。どちらもAJAXリクエストが有効かどうかを確認し、それに応じて投稿を固定(un)し、将来の(un)固定のために新しいURLをエコーアウトします。
/**
* Ajax callback for the stick function
*
* @since 1.0
* @access public
*/
public static function stick()
{
$post_id = self::can_ajax();
stick_post($post_id);
echo self::get_url($post_id);
die();
}
/**
* Ajax callback for the unstick function
*
* @since 1.0
* @access public
* @uses unstick_post
*/
public static function unstick()
{
$post_id = self::can_ajax();
// nonces checked, everything is good to go. Unstick!
unstick_post($post_id);
echo self::get_url($post_id);
die();
}
私たちの2番目の「効用関数」はここに現れます。 can_ajax
は、私たちのナンスとユーザーパーミッションを検証し、投稿IDを(un)stickに返します。チェックが失敗した場合、(die('1')
経由で)終了します。
/**
* Check to see if the current user can ajax. Returns the post ID to
* stick/unstick if successful. Kills the program otherwise
*
* @since 1.0
* @access protected
*/
protected static function can_ajax()
{
$post_id = isset($_REQUEST['post_id']) ? $_REQUEST['post_id'] : '';
if(
!$post_id ||
!check_ajax_referer(self::NONCE . $post_id, 'nonce', false)
) die('0');
if(!current_user_can('edit_post', $post_id))
die('0');
return $post_id;
}
これがその全体です プラグインとしての混乱 。
これはthe_content
filter hookを使って仕事を終わらせるであろうもっと簡単な解決策です。
add_filter('the_content','simplest_sticky_solution');
function simplest_sticky_solution($content){
global $post;
//early exit if not needed
if (!is_single() || !current_user_can('edit_post',$post->ID))
return $content;
//check if form is submitted and act as needed
if (isset($_POST['sticky_action']) && isset($_POST['sticky_id']) && isset($_POST['sticky_nonce']) && wp_verify_nonce($_POST['sticky_nonce'], 'StickIt')){
if (is_sticky($post->ID)){
stick_post($post->ID);
}else{
unstick_post($post->ID);
}
}
//create the form
$label = (is_sticky())? "Unstick": "Stick";
$form = '
<form action="" method="POST">
<input type="hidden" name="sticky_id" value="'.$post->id.'">
<input type="hidden" name="sticky_action" value="stickit">
<input type="hidden" name="sticky_nonce" value="'.wp_create_nonce('StickIt').'">
<input type="button" name="submit" value="'.$label.'">
</form>';
return $form.'<br/>'.$content;
}