رفتن به مطلب

مشکل در استفاده از public function و wp_enqueue


پست های پیشنهاد شده

سلام دوستان

من این کد رو برای یک افزونه نوشتم ولی نمی دونم چرا هیچ کدومشون کار نمیکنن. نه منو نه فراخوانی استایل و اسکریپت و .... خودم مطمئنم این کد یه قسمتاییش اشتباه هست ولی نمی دونم کجا :(

اگه میشه راهنمایی کنید:


public function init(){
add_action('admin_menu', 'test_menu');
add_action( 'admin_enqueue_scripts', 'test_scripts_styles' );
add_action( 'admin_enqueue_scripts', 'test_msg_face' );
add_action('admin_init', 'register_testsettings');
add_action('wp_head', 'sitemsg_add_css');
add_action('admin_head', 'my_admin_head');
add_action( 'init', 'test_translations' );
}

public function test_menu(){
add_menu_page( __("Test 1", 'test'), __("Test 1", 'test'), 1,"test-settings","test_settings_page" ,'dashicons-admin-customizer' );
add_submenu_page("test-settings", __("Test 2", 'test'), __("Test 2", 'test'), 1, "test-settings","test_settings_page");
add_submenu_page('test-settings', __("Test 3", 'test'), __("Test 3", 'test'), 'edit_others_pages', 'test-site-msg', 'sitemsg_settings_page');
}

public function test_scripts_styles($hook){
if ( 'test-settings' != $hook ) {
return;
}

wp_enqueue_scripts( 'admin-test', plugin_dir_url( __FILE__ ) . 'assets/js/admin.js' );
}

public function test_msg_face() {
wp_register_style( 'msg_face_test', plugin_dir_url( __FILE__ ) . 'assets/css/msgs.css' );
wp_enqueue_style( 'msg_face_test' );
}

public function test_translations(){
load_plugin_textdomain('test', false, dirname(plugin_basename(__FILE__)) . '/languages');
}

public function register_testsettings(){
register_setting('site_msg_settings', 'site_msg_settings');
}

لینک به ارسال

در ضمن میخوام از wp_enqueue_scripts در دو صفحه خاص از افزونه استفاده کنم نه در همه ی پیشخوان.

اما میخوام از wp_enqueue_style هم در همه ی پیشخوان و هم در سایت استفاده کنم.

ویرایش شده توسط ghoo
لینک به ارسال

add_action() هارو توی فانکشن

__construct

بذارید

سوال دوم :

کافیه توی فانکشن یه if بذارید و بر اساس نوع صفحه یا اسم صفحه فایل رو فراخوانی کنید !

موفق باشید

ویرایش شده توسط دانیال
لینک به ارسال

اینطوری استفاده کردم نشد:


public function __construct(){
add_action('admin_menu', 'test_menu');
add_action( 'admin_enqueue_scripts', 'test_scripts_styles' );
add_action( 'admin_enqueue_scripts', 'test_msg_face' );
add_action('admin_init', 'register_testsettings');
add_action('wp_head', 'sitemsg_add_css');
add_action('admin_head', 'my_admin_head');
add_action( 'init', 'test_translations' );
}

لینک به ارسال

اگه براتون مقدوره فایل مربوطه رو ارسال کنید

ویرایش شده توسط دانیال
لینک به ارسال

اگه براتون مقدوره فایل مربوطه رو ارسال کنید


<?php
/*
Plugin Name: MY Plugin
Plugin URI: http://myplugin.ir/myplugin
Description: Plugin Description
Requires at least: 4.1.0
Tested up to: 4.3.1
Author: Me
Author URI: http://myplugin.ir/myplugin
Version: 1.0
Text Domain: test
Domain Path: /languages
*/
if (!defined('ABSPATH'))
{
exit; // Exit if accessed directly
}
final class TESTPLUGIN
{
public function __construct()
{
add_action('admin_menu', 'test_menu');
add_action( 'admin_enqueue_scripts', 'test_scripts_styles' );
add_action( 'admin_enqueue_scripts', 'test_msg_face' );
add_action('admin_init', 'register_testsettings');
add_action('wp_head', 'sitemsg_add_css');
add_action('admin_head', 'my_admin_head');
add_action( 'init', 'test_translations' );
}
public function test_menu()
{
add_menu_page( __("Page 1", 'test'), __("Page 1", 'test'), 1,"test-settings","test_settings_page" ,'dashicons-admin-customizer' );
add_submenu_page("test-settings", __("Page 2", 'test'), __("Page 3", 'test'), 1, "test-settings","test_settings_page");
add_submenu_page('test-settings', __("Page 3", 'test'), __("Page 3", 'test'), 'edit_others_pages', 'test-site-msg', 'sitemsg_settings_page');
}

public function test_scripts_styles($hook)
{
if ( 'test-settings' != $hook ) {
return;
}
wp_enqueue_scripts( 'admin-test', plugin_dir_url( __FILE__ ) . 'assets/js/admin.js' );
}

public function test_msg_face() {
wp_register_style( 'msg_face_test', plugin_dir_url( __FILE__ ) . 'assets/css/msgs.css' );
wp_enqueue_style( 'msg_face_test' );
}


public function test_translations()
{
load_plugin_textdomain('test', false, dirname(plugin_basename(__FILE__)) . '/languages');
}


public function register_testsettings()
{
register_setting('site_msg_settings', 'site_msg_settings');
}
}

لینک به ارسال

اصلا چرا توی کلاس این کارو میکنید ؟

خارج از کلاس منو رو اضافه کنید

کلاس رو که حذف می کنم این خطا میاد:


Parse error: syntax error, unexpected 'public' (T_PUBLIC) in ..............

لینک به ارسال

دلیل این که از کلاس استفاده می کنم:

از یکی از نویسندگان که در Codecanyon افزونه داره پرسیدم گفت باید به این صورت باشه.

لینک به ارسال

همچین چیزی


<?php
/*
Plugin Name: MY Plugin
Plugin URI: http://myplugin.ir/myplugin
Description: Plugin Description
Requires at least: 4.1.0
Tested up to: 4.3.1
Author: Me
Author URI: http://myplugin.ir/myplugin
Version: 1.0
Text Domain: test
Domain Path: /languages
*/
if (!defined('ABSPATH'))
{
exit; // Exit if accessed directly
}
add_action('admin_menu', 'e_add_menu');
function e_add_menu(){
add_menu_page("تماس با ایگل دیزاین", "پیام ها", "manage_options", "inbox", "Inbox_messages", 'dashicons-format-status', 4);
add_submenu_page('inbox', 'پیام ها', "پیام ها", 'manage_options', 'inbox', 'Inbox_messages');
add_submenu_page('inbox', 'سفارش ها', "سفارش ها", 'manage_options', 'order', 'Inbox_orders');
}

final class TESTPLUGIN
{
function __construct(){
add_action('admin_menu', 'test_menu');
add_action( 'admin_enqueue_scripts', 'test_scripts_styles' );
add_action( 'admin_enqueue_scripts', 'test_msg_face' );
add_action('admin_init', 'register_testsettings');
add_action('wp_head', 'sitemsg_add_css');
add_action('admin_head', 'my_admin_head');
add_action( 'init', 'test_translations' );

}

function test_menu()
{
add_menu_page( __("Page 1", 'test'), __("Page 1", 'test'), 1,"manage_options","test_settings_page" ,'dashicons-admin-customizer' );
add_submenu_page("test-settings", __("Page 2", 'test'), __("Page 3", 'test'), 1, "manage_options","test_settings_page");
add_submenu_page('test-settings', __("Page 3", 'test'), __("Page 3", 'test'), 'edit_others_pages', 'test-site-msg', 'sitemsg_settings_page');
}
public function test_scripts_styles($hook)
{
if ( 'test-settings' != $hook ) {
return;
}
wp_enqueue_scripts( 'admin-test', plugin_dir_url( __FILE__ ) . 'assets/js/admin.js' );
}

public function test_msg_face() {
wp_register_style( 'msg_face_test', plugin_dir_url( __FILE__ ) . 'assets/css/msgs.css' );
wp_enqueue_style( 'msg_face_test' );
}

public function test_translations()
{
load_plugin_textdomain('test', false, dirname(plugin_basename(__FILE__)) . '/languages');
}

public function register_testsettings()
{
register_setting('site_msg_settings', 'site_msg_settings');
}
}

لینک به ارسال

مشکلی با این که خارج از کلاس باشه و به صورت public function نباشه ندارم اما می خوام بدونم چرا با public function کار نمیکنه.

دلیل این که از کلاس استفاده می کنم:

از یکی از نویسندگان که در Codecanyon افزونه داره پرسیدم گفت باید به این صورت باشه.

لینک به ارسال

سلام، شما وقتی میخواید یه فانکشن رو در کلاس یا بیرون کلاس، هُک کنید، باید پارامتر تابع رو به صورت آرایه بفرستید. عضو اول آرایه یه instance یا نام کلاسی هست که فانکشن در اون کلاس وجود داره و دوم هم اسم فانکشنه.

مثال:


class A {
public function __construct() {
add_action( 'init', array( $this, 'test' ) );
}

public function test() {
echo 'test';
}
}

مثال 2:


add_action( 'init', array( 'A', 'test' );
class A {
// ...
}

موفق باشید.

لینک به ارسال

سلام، شما وقتی میخواید یه فانکشن رو در کلاس یا بیرون کلاس، هُک کنید، باید پارامتر تابع رو به صورت آرایه بفرستید. عضو اول آرایه یه instance یا نام کلاسی هست که فانکشن در اون کلاس وجود داره و دوم هم اسم فانکشنه.

مثال:


class A {
public function __construct() {
add_action( 'init', array( $this, 'test' ) );
}

public function test() {
echo 'test';
}
}

مثال 2:


add_action( 'init', array( 'A', 'test' );
class A {
// ...
}

موفق باشید.

خیلی ممنون.

درست شد.

من برای تنظیمات افزونه کدهای html رو به همراه فانکشن مربوط به اون توی یه فایل جدا گذاشتم:


<?php
public function test_settings_page() {
?>
<div class="wrap">
<div class="pptitle"><span class="dashicons dashicons-admin-generic"></span><?php _e('My Plugin', 'test'); ?></div>
<?php
//show saved options message
if($_REQUEST['settings-updated']) : ?>
<br/><br/><div id="message" class="updated below-h2 notice is-dismissible"><p><?php _e('Settings Saved.', 'test'); ?></p><button type="button" class="notice-dismiss"><span class="screen-reader-text"><?php _e('Close', 'test'); ?></span></button></div>
<?php endif; ?>
<form method="post" action="options.php">
<?php settings_fields('plugin_settings'); ?>
<?php $options = get_option('plugin_settings'); ?>
<table class="form-table">
<h3><?php _e('Custom Text', 'test'); ?></h3>
<tr valign="top">
<th scope="row"><?php _e('Custom Text', 'test'); ?></th>
<td><textarea name="plugin_settings[option1]" style="direction:ltr;" cols="60" rows="5" id="plugin_settings[option1]" class="regular-text"><?php esc_attr_e($options['option1']); ?></textarea></td>
</tr>
</table>
<p class="submit">
<input type="submit" class="button-primary" value="<?php _e('Save Changes', 'test'); ?>" />
</p>
</form>
</div>
<?php }

و با دستور include اون فایل رو فراخوانی می کنم.

اگه دستور include رو توی کلاس بزارم این خطا میاد:


Parse error: syntax error, unexpected 'public' (T_PUBLIC) in C:\wamp\www\wp\wp-content\plugins\my-plugin\includes\plugin-settings.php on line 2

اگر هم نزارم باز همین خطا میاد.

فانکشن test_settings_page در add_menu_page استفاده میشه.

ویرایش شده توسط ghoo
لینک به ارسال

در خارج از یک کلاس، کلیدواژه public معنی نداره، برای حل خطا، واژه public رو حذف کنید.

موفق باشید.

لینک به ارسال

در خارج از یک کلاس، کلیدواژه public معنی نداره، برای حل خطا، واژه public رو حذف کنید.

موفق باشید.

ممنون مشکل اول یعنی استفاده از public function حل شد. حالا مونده توابع wp_enqueue_style و wp_enqueue_scripts :)

این توابع رو به این صورت استفاده می کنم:


public function myplugin_scripts_styles() {
wp_enqueue_scripts( 'admin-wfc', plugin_dir_url( __FILE__ ) . 'assets/js/admin.js' );
wp_register_style( 'mypluginstyle', plugin_dir_url( __FILE__ ) . 'assets/css/style.css' );
wp_enqueue_style( 'mypluginstyle' );
}

public function __construct() {
add_action( 'wp_enqueue_scripts', array( $this, 'myplugin_scripts_styles'));
}

نه فایل جاوا اسکریپت فراخوانی میشه نه سی اس اس.

لینک به ارسال

در ضمن میخوام از wp_enqueue_scripts در دو صفحه خاص از افزونه استفاده کنم نه در همه ی پیشخوان.

اما میخوام از wp_enqueue_style هم در همه ی پیشخوان و هم در سایت استفاده کنم.

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...