如何解决WordPress 插件:挂钩 post_row_actions 函数的自定义 PHP 的内容
我创建了一个 wordpress 插件,带有一个钩子,用于在后端帖子概述下方创建链接(用于自定义帖子类型)。
链接应重定向到自定义 PHP 文件。目前是这样解决的(对于 Terminierungsverwaltung):
class CustomPlugin
{
function __construct(){
#... more code
/**
* Terminverwaltung
*/
add_filter( 'post_row_actions',array( $this,'termin_add_user_action_button'),10,2 );
#... more code
}
#... more code
function termin_add_user_action_button($actions,$post){
global $wpdb;
$post_id = $post->ID; //post ID
$poll_id; //poll ID
$wordpress_polls = $wpdb->get_results("SELECT wordpress_id,poll_id FROM " . self::wordpress_TABLE_NAME . " WHERE wordpress_id = " . $post_id);
$wordpress_polls_rows = $wpdb->num_rows;
foreach($wordpress_polls as $wordpress_poll){
$poll_id = $wordpress_poll->poll_id;
}
if($wordpress_polls_rows === NULL || $wordpress_polls_rows === 0){
return $actions;
} else{
if(get_post_type() === 'workshop'){
$url = add_query_arg(
array(
'post_id' => $post->ID,'poll_id' => $poll_id,),plugins_url( '/attendees.PHP',__FILE__ )
);
$actions['termin_add_user'] = '<a href="' . $url . '" target="_blank">Teilnehmerverwaltung</a>';
}
return $actions;
}
}
#... more code
}
所以目前我直接指向源文件 attendees.PHP
(位于插件目录内)并且它不受保护。
我的目标是通过以下方式保护 attendees.PHP
:
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
显然,我需要以某种方式将文件挂钩到插件或 wordpress,因此定义了 ABSPATH。但我不知道该怎么做。有谁知道如何完成这项工作?
我是 PHP 和 wordpress 的新手,如果这是一个新手问题,很抱歉。
提前致谢!
THE-E
如果 attendees.PHP
很重要,它目前有这个结构,应该独立显示:
<?PHP
// if ( ! defined( 'ABSPATH' ) ) {
// exit; // Exit if accessed directly.
// }
require '../../../wp-load.PHP';
require 'src/attendees_function.PHP';
?>
<!DOCTYPE html>
<html lang="de">
<head>
<Meta charset="utf-8">
<Meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel = "stylesheet"
type = "text/css"
href = "style/attendeesstyle.css" />
<title>Teilnehmerverwaltung: <?PHP echo get_the_title($_REQUEST['post_id']);?></title>
</head>
<body>
<?PHP add_user_form(); ?>
<?PHP delete_attendee(); ?>
<?PHP upload(); ?>
<H1>Teilnehmerverwaltung</H1>
<H2><?PHP echo get_the_title($_REQUEST['post_id']);?></H2>
<section>
<div id="add-users-upload">
<form method="POST" enctype="multipart/form-data" id="csv-form">
<input type="file" name="teilnehmer-csv" accept=".csv"><br>
<button type="submit" name="csv-upload" id="top-buttons">Teilnehmer CSV hochladen</button>
</form>
<form method="post">
<label for="kuerzel">Kürzel:</label>
<input type="hidden" name="poll-id" value="<?PHP $poll_id = $_REQUEST['poll_id']; echo $poll_id; ?>"/>
<input type="hidden" name="table" value="<?PHP $table = "oc_polls_share"; echo $table; ?>"/>
<input type="text" class="form-control" id="input-kuerzel" name="kuerzel"><br>
<button type="submit" name="add-user-form" id="top-buttons">Teilnehmer anlegen</button>
</form>
</div>
</section>
<div id="table-div">
<table>
</thead>
<tr>
<td id="index">#</td>
<td id="index">Status</td>
<td id="header">Kürzel</td>
<td id="header">E-Mail</td>
<td id="header">Vorname</td>
<td id="header">Nachname</td>
<td id="header">Geburtstag</td>
<td id="header">Token</td>
<td id="header">Löschen</td>
<td id="header">Umfrage-Link</td>
<td id="header">Webseiten-Link</td>
<td id="header">Senden</td>
</tr>
</thead>
<tbody>
<?PHP
$nextcloud_base_url = "https://example.com";
$nextcloud_attendees_base_url = $nextcloud_base_url . "/apps/polls/s/";
if(isset($_REQUEST['post_id']) && isset($_REQUEST['poll_id'])){
$post_id = $_REQUEST['post_id']; //post ID
$poll_id = $_REQUEST['poll_id']; //poll ID
}
$wordpress_polls_table_name = 'wordpress_polls'; //storage of primary keys of post id and poll id
$polls_share_table_name = 'oc_polls_share'; //attendees table
$wordpress_polls = get_wordpress_polls($wordpress_polls_table_name,$post_id);
$wordpress_polls_rows = get_wordpress_polls($wordpress_polls_table_name,$post_id);
$poll_id = get_poll_id($wordpress_polls);
if($wordpress_polls_rows === NULL || $wordpress_polls_rows === 0){
return;
} else {
$attendees = get_attendees($polls_share_table_name,$poll_id);
$attendees_rows = get_attendees_rows($polls_share_table_name,$poll_id);
create_attendee_rows($attendees,$nextcloud_attendees_base_url);
}
?>
</tbody>
</table>
</div>
<div id="legende">
<p>
Status-Legende:<br>
❌ = Abstimmung nicht erfolgt<br>
✅ = Abstimmung erfolgt
</p>
</div>
</body>
</html>
编辑: 我正在查看自定义端点文档,但目前无法使用。
解决方法
有很多方法可以解决这个问题,我将尝试概述。这些不是推荐的顺序,只是意识流。但是,如果可行,我会推荐 #2。
1 - 手动启动 WordPress
此 question shows 显示了如何执行此操作,this answer 给出了每种方法的优缺点,但总体思路是 require_once
wp-load.php
或 {{1 }} 文件,你可能想要前者。但是,通常不鼓励这样做,我只会在您需要访问基本 WordPress 功能的情况下推荐它。如果您这样做,WordPress 不知道您的安全要求是什么,因此您可以使用 wp-blog-header.php
之类的东西来执行访问控制。
虽然我先发布了这个,但我强烈建议避免这种情况,如果你要分发你的插件,尤其是在 WordPress.org 存储库中,绝对不要这样做,因为我很确定它会被拒绝。
2 - 创建一个真正的 WordPress 管理页面
如果您愿意牺牲一些像素空间(用于管理工具栏),这是推荐的方式。只需使用 add_menu_page
注册一个菜单,您就可以current_user_can
或 echo
/include
您的代码:
require
此页面的 URL 是基于该函数的第四个参数,使用上述参数将是 add_action(
'admin_menu',static function () {
add_menu_page(
'My Plugin','My Plugin','manage_options','my-plugin',static function () {
// Either echo here or use an include/require
echo '<h1>Hello world</h1>';
}
);
}
);
。访问控制由第三个参数自动处理,该参数确保用户具有 /wp-admin/admin.php?page=my-plugin
权限。您可以根据需要对其进行自定义,也可以选择创建自己的权限。
3 - 通过模板注入
manage_options
函数用于确定使用哪个前端 WordPress 模板。就个人而言,我不喜欢将其用于管理内容,因为我喜欢将事物彼此分开,但这只是我自己。在下面的这个代码示例中,我在主题文件夹中设置了一个模板,但它也可以很容易地放在插件文件夹中。
template_include
add_filter(
'template_include',static function ($template) {
// Pick whatever logic you want here,it could be `_GET` or `_POST` or pretty much anything
if ('my-plugin' === ($_GET['action'] ?? null)) {
$template = get_template_directory() . '/searchform.php';
}
return $template;
}
);
逻辑是您随心所欲的地方。我只是展示了一个简单的 if
检查 URL 是 _GET
。安全性再次取决于您,但您可以完全访问 WordPress 核心功能(例如 /?action=my-plugin
)以执行任何必要的操作。
4 - 重写端点
这实际上是 #3 的一个版本,因为您只是让 URL 更漂亮。我个人认为它过于复杂,因为它是一个包含许多活动部分的多步骤过程,但如果 URL 对您很重要,它可能会起作用。确保刷新您的永久链接!关键在于 rewrite_rules_array
,您可以在其中为 URL 注册自定义正则表达式,并且您可以提供您需要的任何逻辑,包括查询字符串等。
current_user_can
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。